Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

Motivation


This case study explores how different countries have contributed to Carbon Dioxide (CO2) emissions over time and how CO2 emission rates may relate to increasing global temperatures and increased rates of natural disasters and storms. This report provides a basis for the motivation: https://www.epa.gov/report-environment/greenhouse-gases.

CO2 makes up the largest proportion of greenhouse gas emissions in the United States:

A variety of sources and sectors contribute to greenhouse gas emissions, with transportation contributing the most metric tons of CO2:

So why should we pay attention to greenhouse gases?

According to the US Environmental Protection Agency (EPA) Inventory of U.S. Greenhouse Gas Emissions and Sinks 2020 Report:

Greenhouse gases absorb infrared radiation, thereby trapping heat in the atmosphere and making the planet warmer. The most important greenhouse gases directly emitted by humans include carbon dioxide (CO2), methane (CH4), nitrous oxide (N2O), and several fluorine-containing halogenated substances. Although CO2, CH4, and N2O occur naturally in the atmosphere, human activities have changed their atmospheric concentrations. From the pre- industrial era (i.e., ending about 1750) to 2018, concentrations of these greenhouse gases have increased globally by 46, 165, and 23 percent, respectively (IPCC 2013; NOAA/ESRL 2019a, 2019b, 2019c).

  • IPCC stands for the Intergovernmental Panel on Climate Change

There are many signs that our planet is experiencing warmer temperatures:

The connection between greenhouse gas levels and global temperatures and the influence of increased global temperatures on human health are motivated by these reports:

Melillo, J.M., T.C. Richmond, and G.W. Yohe (eds.). 2014. Climate change impacts in the United States: The third National Climate Assessment. U.S. Global Change Research Program.

  1. “Inventory of US Greenhouse Gas Emissions and Sinks: 1990–2018.” EPA 430-R-20-002, Tech. Rep. https://www.epa.gov/ghgemissions/inventory-us-greenhouse-gas-emissions-and-sinks.

The National Climate Assessment Report states that:

Heat-trapping gases already in the atmosphere have committed us to a hotter future with more climate-related impacts over the next few decades. The magnitude of climate change beyond the next few decades depends primarily on the amount of heat-trapping gases that human activities emit globally, now and in the future.

See here and here for more information.

Main Questions


Our main question:

  1. How have global CO2 emission rates changed over time? In particular for the US, and how does the US compare to other countries?
  2. Are US CO2 emissions, global temperatures, and US storm rates associated?

Learning Objectives


In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and storm activity. This case study will particularly focus on how to use different datasets that span different ranges of time, as well as how to create visualizations of patterns over time. We will especially focus on using packages and functions from the Tidyverse, such as dplyr, tidyr, plotlyand gganimate. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially efficient.


We will begin by loading the packages that we will need:

Package Use
here to easily load and save data
readxl to import the excel file data
readr to import the csv file data
dplyr to view and wrangle the data
magrittr to use and reassign data objects using the %<>%pipe operator
tidyverse to wrangle the data and create ggplot2 plots
plotyly to make the visualizations
ggplot2 to make visualizations
ggrepel to add labels that don’t overlap to plots
gganimate to make the plots interactive
RColorBrewer to have greater control over the color in our plots

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Context


Greenhouse gas emissions are due to both natural processes and anthropogenic (human-derived) activities.

These emissions are one of the contributing factors to rising global temperatures, which can have a great influence on public health as illustrated in the following image:

Gases in the atmosphere can contribute to climate change both directly and indirectly. Direct effects occur when the gas itself absorbs radiation. Indirect radiative forcing occurs when chemical transformations of the substance produce other greenhouse gases, when a gas influences the atmospheric lifetimes of other gases, and/or when a gas affects atmospheric processes that alter the radiative balance of the earth (e.g., affect cloud formation or albedo). The IPCC developed the Global Warming Potential (GWP) concept to compare the ability of a greenhouse gas to trap heat in the atmosphere relative to another gas. The GWP of a greenhouse gas is defined as the ratio of the accumulated radiative forcing within a specific time horizon caused by emitting 1 kilogram of the gas, relative to that of the reference gas CO2 (IPCC 2013). Therefore GWP-weighted emissions are provided in million metric tons of CO2 equivalent (MMT CO2 Eq.)

CO2 is actually the least capable of the greenhouse gases for trapping heat:

However, because CO2 is so much more abundant and stays in the atmosphere so much longer than other greenhouse gases, it has been the largest contributor to global warming.

See here for more details.

Furthermore, sizing CO2 levels also influence ocean acidity:

This makes it difficult for organisms to maintain their shells or skeletons that are made of calcium carbonate, thus making it more difficult for these organisms to survive and impacting their role in the ecosystem and food chain.

Furthermore, greenhouse gas emissions are believed to influence storm rates.

Indeed events with high levels of precipitation which can induce flooding and property damage are generally increasing around the country:

Limitations


There are some important considerations regarding this data analysis to keep in mind:

  1. Correlation or association does not imply causation

  2. Limitaiton 2

What are the data?


In this case study we will be using data related to CO2 emissions, as well as other data that may influence, be influenced or relate to CO2 emissions. Most of our data was obtained from Gapminder, which is a unique nonprofit that provides a variety of data for free.

In their words, Gapminder is…

Gapminder is an independent Swedish foundation with no political, religious or economic affiliations. Gapminder is a fact tank, not a think tank. Gapminder fights devastating misconceptions about global development. Gapminder produces free teaching resources making the world understandable based on reliable statistics. Gapminder promotes a fact-based worldview everyone can understand. Gapminder collaborates with universities, UN, public agencies and non-governmental organizations. All Gapminder activities are governed by the board. We do not award grants. Gapminder Foundation is registered at Stockholm County Administration Board. Our constitution can be found here.

The data that we will be using from Gapminder was obtained from the World Bank.

In addition we will use some data that is specific to the United States from the [National Oceanic and Atmospheric Administration (NOAA)] (https://www.noaa.gov/), which is an agency that collects weather and climate data.

Data Time span Source Orginal Source Description Citation
CO2 emissions 1751 to 2014 Gapminder Carbon Dioxid Information Analysis Center (CDIAC) CO2 emissions in tonnes or metric tons (equivalent to approximately 2,204.6 pounds) per person by country NA
GDP per capita, yearly growth 1801 to 2019 Gapminder World Bank Growth Domestic Product (which is an overall measure of the health of nation’s economy) per person by country NA
Energy use per person 1960 to 2015 Gapminder World Bank Use of primary energy before transformation to other end-use fules, by country NA
Crude Mortality Rate 1960 to 2018 World Bank World Bank Death rate per 1,000 people by country NA
US Natural Disasters 1980 to 2019 The National Oceanic and Atmospheric Administration (NOAA) The National Oceanic and Atmospheric Administration (NOAA) US data about:
– Droughts
– Floods
– Freezes
– Severe Storms
– Tropical Cyclones
– Wildfires
– Winter Storms
NOAA National Centers for Environmental Information (NCEI) U.S. Billion-Dollar Weather and Climate Disasters (2020). https://www.ncdc.noaa.gov/billions/, DOI: 10.25921/stkw-7w73
Temperature 1895 to 2019 The National Oceanic and Atmospheric Administration (NOAA) The National Oceanic and Atmospheric Administration (NOAA) US National yearly average temperature (in Fahrenheit) from 1895 to 2019 NOAA National Centers for Environmental information, Climate at a Glance: National Time Series, published June 2020, retrieved on June 26, 2020 from https://www.ncdc.noaa.gov/cag/

To obtain the temperature data, annual average temperatures were selected as shown in this image:

Importantly, notice that the data we would like to use span different time periods:

Data Time span
CO2 emissions 1751 to 2014
GDP per capita, yearly growth 1801 to 2019
Energy use per person 1960 to 2015
Crude Mortality Rate 1960 to 2018
US Natural Disasters 1980 to 2019
Temperature 1895 to 2019

Data Import


To read in the files that were downloaded from the various sources as indicated in the table above, we will use the read_xlsx() and read_xls() functions of the readxl package to import the data from the .xlsx and .xls files respectively and we will use the read_csv function of the readr package to import the data from the csv files.

For our csv data files, there are some lines that we would like to not import - infact, we will get an error if we try to import them because our table structure will be as r expects. We can do so using the skip = argument of the read_csv() function.

Here you can see that the first two rows of the data about US Disasters doesn’t have the same number of columns as the subsequent rows. So we want to skip these first two lines, we will use skip = 2 for this.

Now looking at the temperature data, we can see that the first four lines do not have the same number of columns as the subsequent lines. We will skip importing all 4 lines by using skip = 4. We can also specify that NA values are encoded as "-99". This will replace all instances of "-99" with NA. We can do this using the na = argument of the read_csv() function. We will do so as: na = "-99". The “-99” needs to be in quotation markes becuase this argument expects characters.

Great! now we have imported all of the data that we will need.

Data Exploration and Wrangling


Now we will take a look at our data and wrangle it until it is easy to use to allow us to evaluate how CO2 emissions have changed over time and how emissions may relate to energy use, mortality, GDP etc.

Yearly CO2 Emissions

First let’s take a look at the CO2 data. We can use the base head() function to see just the first 6 rows of our data.

We will use the %>% pipe which can be used to define the input for later sequential steps. This will make more sense when we have multiple sequential steps using the same data object. To use the pipe notation we need to install and load the dplyr package.

# A tibble: 6 x 265
  country `1751` `1752` `1753` `1754` `1755` `1756` `1757` `1758` `1759` `1760`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Afghan…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Andorra     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 254 more variables: `1761` <dbl>, `1762` <dbl>, `1763` <dbl>,
#   `1764` <dbl>, `1765` <dbl>, `1766` <dbl>, `1767` <dbl>, `1768` <dbl>,
#   `1769` <dbl>, `1770` <dbl>, `1771` <dbl>, `1772` <dbl>, `1773` <dbl>,
#   `1774` <dbl>, `1775` <dbl>, `1776` <dbl>, `1777` <dbl>, `1778` <dbl>,
#   `1779` <dbl>, `1780` <dbl>, `1781` <dbl>, `1782` <dbl>, `1783` <dbl>,
#   `1784` <dbl>, `1785` <dbl>, `1786` <dbl>, `1787` <dbl>, `1788` <dbl>,
#   `1789` <dbl>, `1790` <dbl>, `1791` <dbl>, `1792` <dbl>, `1793` <dbl>,
#   `1794` <dbl>, `1795` <dbl>, `1796` <dbl>, `1797` <dbl>, `1798` <dbl>,
#   `1799` <dbl>, `1800` <dbl>, `1801` <dbl>, `1802` <dbl>, `1803` <dbl>,
#   `1804` <dbl>, `1805` <dbl>, `1806` <dbl>, `1807` <dbl>, `1808` <dbl>,
#   `1809` <dbl>, `1810` <dbl>, `1811` <dbl>, `1812` <dbl>, `1813` <dbl>,
#   `1814` <dbl>, `1815` <dbl>, `1816` <dbl>, `1817` <dbl>, `1818` <dbl>,
#   `1819` <dbl>, `1820` <dbl>, `1821` <dbl>, `1822` <dbl>, `1823` <dbl>,
#   `1824` <dbl>, `1825` <dbl>, `1826` <dbl>, `1827` <dbl>, `1828` <dbl>,
#   `1829` <dbl>, `1830` <dbl>, `1831` <dbl>, `1832` <dbl>, `1833` <dbl>,
#   `1834` <dbl>, `1835` <dbl>, `1836` <dbl>, `1837` <dbl>, `1838` <dbl>,
#   `1839` <dbl>, `1840` <dbl>, `1841` <dbl>, `1842` <dbl>, `1843` <dbl>,
#   `1844` <dbl>, `1845` <dbl>, `1846` <dbl>, `1847` <dbl>, `1848` <dbl>,
#   `1849` <dbl>, `1850` <dbl>, `1851` <dbl>, `1852` <dbl>, `1853` <dbl>,
#   `1854` <dbl>, `1855` <dbl>, `1856` <dbl>, `1857` <dbl>, `1858` <dbl>,
#   `1859` <dbl>, `1860` <dbl>, …

OK, we can see that our country data makes of the rows and the yearly data makes up the columns. We also see that we have alot of NA values.

We can also use the glimpse() function of the dplyr packge to view our data. This allows us to see more of our data at once. We will see a tiny bit of each variable/column. To do so our data will be displayed with the column names listed on the right.

Rows: 192
Columns: 265
$ country <chr> "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "An…
$ `1751`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1752`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1753`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1754`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1755`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1756`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1757`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1758`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1759`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1760`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1761`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1762`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1763`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1764`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1765`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1766`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1767`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1768`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1769`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1770`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1771`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1772`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1773`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1774`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1775`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1776`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1777`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1778`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1779`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1780`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1781`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1782`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1783`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1784`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1785`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1786`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1787`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1788`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1789`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1790`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1791`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1792`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1793`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1794`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1795`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1796`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1797`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1798`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1799`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1800`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1801`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1802`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1803`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1804`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1805`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1806`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1807`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 169, NA, NA, NA, NA, NA, …
$ `1808`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1809`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1810`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1811`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1812`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1813`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1814`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1815`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1816`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1817`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1818`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1819`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 253, NA, NA, NA, NA, NA, …
$ `1820`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 334, NA, NA, NA, NA, NA, …
$ `1821`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 359, NA, NA, NA, NA, NA, …
$ `1822`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 367, NA, NA, NA, NA, NA, …
$ `1823`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 348, NA, NA, NA, NA, NA, …
$ `1824`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 400, NA, NA, NA, NA, NA, …
$ `1825`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 403, NA, NA, NA, NA, NA, …
$ `1826`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 458, NA, NA, NA, NA, NA, …
$ `1827`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 477, NA, NA, NA, NA, NA, …
$ `1828`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 458, NA, NA, NA, NA, NA, …
$ `1829`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 477, NA, NA, NA, NA, NA, …
$ `1830`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.032, NA, 495.000, 0.308, NA, NA…
$ `1831`  <dbl> NA, NA, NA, NA, NA, NA, NA, 3.84e-02, NA, 4.80e+02, 3.70e-01,…
$ `1832`  <dbl> NA, NA, NA, NA, NA, NA, NA, 2.56e-02, NA, 5.13e+02, 2.47e-01,…
$ `1833`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.032, NA, 429.000, 0.308, NA, NA…
$ `1834`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 587, NA, NA, NA, NA, NA, …
$ `1835`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 634, NA, NA, NA, NA, NA, …
$ `1836`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 675, NA, NA, NA, NA, NA, …
$ `1837`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 708, NA, NA, NA, NA, NA, …
$ `1838`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 851, NA, NA, NA, NA, NA, …
$ `1839`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1060, NA, NA, NA, NA, NA,…
$ `1840`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1170, NA, NA, NA, NA, NA,…
$ `1841`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1320, NA, NA, NA, NA, NA,…
$ `1842`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1460, NA, NA, NA, NA, NA,…
$ `1843`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1270, NA, NA, NA, NA, NA,…
$ `1844`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1600, NA, NA, NA, NA, NA,…
$ `1845`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1800, NA, NA, NA, NA, NA,…
$ `1846`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2120, NA, NA, NA, NA, NA,…
$ `1847`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2080, NA, NA, NA, NA, NA,…
$ `1848`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2340, NA, NA, NA, NA, NA,…
$ `1849`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2260, NA, NA, NA, NA, NA,…
$ `1850`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.198, NA, 2330.000, 1.910, NA, N…
$ `1851`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2340, NA, NA, NA, NA, NA,…
$ `1852`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2810, NA, NA, NA, NA, NA,…
$ `1853`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 3230, NA, NA, NA, NA, NA,…
$ `1854`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 3180, NA, NA, NA, NA, NA,…
$ `1855`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.01e-01, NA, 3.70e+03, 5.80e+00,…
$ `1856`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 4240, NA, NA, NA, NA, NA,…
$ `1857`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 4880, NA, NA, NA, NA, NA,…
$ `1858`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.44e-01, NA, 7.25e+03, 8.14e+00,…
$ `1859`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.95e-01, NA, 5.87e+03, 8.64e+00,…
$ `1860`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.18, 279.00, 6150.00, 11.40, NA,…
$ `1861`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.5, 510.0, 6380.0, 14.5, NA, NA,…
$ `1862`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.36, 356.00, 6360.00, 13.10, NA,…
$ `1863`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.42, 400.00, 5880.00, 13.70, NA,…
$ `1864`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.59, 268.00, 5080.00, 15.40, NA,…
$ `1865`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.52, 422.00, 5360.00, 14.70, NA,…
$ `1866`  <dbl> NA, NA, NA, NA, NA, NA, NA, 4.81, 697.00, 3600.00, 46.40, NA,…
$ `1867`  <dbl> NA, NA, NA, NA, NA, NA, NA, 5.52, 895.00, 4920.00, 53.20, NA,…
$ `1868`  <dbl> NA, NA, NA, NA, NA, NA, NA, 4.59, 733.00, 6080.00, 44.30, NA,…
$ `1869`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.23, 642.00, 6490.00, 60.10, NA,…
$ `1870`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.76, 601.00, 7370.00, 65.20, NA,…
$ `1871`  <dbl> NA, NA, NA, NA, NA, NA, NA, 9.12, 693.00, 10200.00, 88.00, NA…
$ `1872`  <dbl> NA, NA, NA, NA, NA, NA, NA, 9.36, 708.00, 10000.00, 90.40, NA…
$ `1873`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.79, 869.00, 10700.00, 84.80, NA…
$ `1874`  <dbl> NA, NA, NA, NA, NA, NA, NA, 10.7, 891.0, 9160.0, 103.0, NA, N…
$ `1875`  <dbl> NA, NA, NA, NA, NA, NA, NA, 12.3, 829.0, 7870.0, 119.0, NA, N…
$ `1876`  <dbl> NA, NA, NA, NA, NA, NA, NA, 15.2, 931.0, 8100.0, 147.0, NA, N…
$ `1877`  <dbl> NA, NA, NA, NA, NA, NA, NA, 15.6, 1070.0, 7290.0, 150.0, NA, …
$ `1878`  <dbl> NA, NA, NA, NA, NA, NA, NA, 20.3, 968.0, 7250.0, 196.0, NA, N…
$ `1879`  <dbl> NA, NA, NA, NA, NA, NA, NA, 20.9, 1460.0, 8870.0, 201.0, NA, …
$ `1880`  <dbl> NA, NA, NA, NA, NA, NA, NA, 24.5, 2210.0, 23700.0, 236.0, NA,…
$ `1881`  <dbl> NA, NA, NA, NA, NA, NA, NA, 25.80, 1770.00, 10300.00, 249.00,…
$ `1882`  <dbl> NA, NA, NA, NA, NA, NA, NA, 27.20, 2010.00, 10600.00, 262.00,…
$ `1883`  <dbl> NA, NA, NA, NA, NA, NA, NA, 30.90, 2430.00, 11800.00, 298.00,…
$ `1884`  <dbl> NA, NA, NA, NA, NA, NA, NA, 31.4, 2570.0, 11500.0, 303.0, NA,…
$ `1885`  <dbl> NA, NA, NA, NA, NA, NA, NA, 34.20, 2910.00, 12100.00, 330.00,…
$ `1886`  <dbl> NA, NA, NA, NA, NA, NA, NA, 35.10, 2890.00, 11400.00, 338.00,…
$ `1887`  <dbl> NA, NA, NA, NA, NA, NA, 1090.0, 37.1, 3040.0, 12300.0, 358.0,…
$ `1888`  <dbl> NA, NA, NA, NA, NA, NA, 891.0, 38.7, 3530.0, 12000.0, 373.0, …
$ `1889`  <dbl> NA, NA, NA, NA, NA, NA, 1760.0, 41.8, 3430.0, 12900.0, 403.0,…
$ `1890`  <dbl> NA, NA, NA, NA, NA, NA, 1370.0, 47.3, 3550.0, 13000.0, 457.0,…
$ `1891`  <dbl> NA, NA, NA, NA, NA, NA, 939.0, 52.1, 4010.0, 15000.0, 503.0, …
$ `1892`  <dbl> NA, NA, NA, NA, NA, NA, 1390.0, 55.1, 4150.0, 14500.0, 532.0,…
$ `1893`  <dbl> NA, NA, NA, NA, NA, NA, 1550.0, 64.6, 3970.0, 17700.0, 624.0,…
$ `1894`  <dbl> NA, NA, NA, NA, NA, NA, 1990.0, 65.8, 4360.0, 18100.0, 635.0,…
$ `1895`  <dbl> NA, NA, NA, NA, NA, NA, 2270.0, 75.6, 4590.0, 20400.0, 730.0,…
$ `1896`  <dbl> NA, NA, NA, NA, NA, NA, 2310, 77, 4510, 21300, 743, NA, NA, N…
$ `1897`  <dbl> NA, NA, NA, NA, NA, NA, 2080, 89, 4980, 23000, 859, NA, NA, N…
$ `1898`  <dbl> NA, NA, NA, NA, NA, NA, 2350.0, 99.9, 5620.0, 24500.0, 964.0,…
$ `1899`  <dbl> NA, NA, NA, NA, NA, NA, 2920, 116, 5790, 24800, 1120, NA, NA,…
$ `1900`  <dbl> NA, NA, NA, NA, NA, NA, 2070, 131, 10200, 27700, 1270, NA, NA…
$ `1901`  <dbl> NA, NA, NA, NA, NA, NA, 2490, 135, 11400, 28400, 1300, NA, NA…
$ `1902`  <dbl> NA, NA, NA, NA, NA, NA, 2820, 130, 11400, 25700, 1260, NA, NA…
$ `1903`  <dbl> NA, NA, NA, NA, NA, NA, 2860, 127, 11200, 25600, 1230, NA, NA…
$ `1904`  <dbl> NA, NA, NA, NA, NA, NA, 3800, 142, 11600, 26900, 1370, NA, NA…
$ `1905`  <dbl> NA, NA, NA, NA, NA, NA, 3990, 126, 12100, 28100, 1220, NA, NA…
$ `1906`  <dbl> NA, NA, NA, NA, NA, NA, 6260, 144, 14400, 33600, 1390, NA, NA…
$ `1907`  <dbl> NA, NA, NA, NA, NA, NA, 6260, 161, 15500, 42200, 1560, NA, NA…
$ `1908`  <dbl> NA, NA, NA, NA, NA, NA, 7620, 162, 16800, 59000, 1570, NA, NA…
$ `1909`  <dbl> NA, NA, NA, NA, NA, NA, 5940, 172, 14600, 42200, 1660, NA, NA…
$ `1910`  <dbl> NA, NA, NA, NA, NA, NA, 8910, 168, 17500, 57600, 1620, NA, NA…
$ `1911`  <dbl> NA, NA, NA, NA, NA, NA, 9950, 174, 19300, 48100, 1680, NA, NA…
$ `1912`  <dbl> NA, NA, NA, NA, NA, NA, 9490, 198, 20800, 50000, 1910, NA, NA…
$ `1913`  <dbl> NA, NA, NA, NA, NA, NA, 10200, 215, 22400, 59700, 2070, NA, N…
$ `1914`  <dbl> NA, NA, NA, NA, NA, NA, 8680, 194, 24500, 48900, 1870, NA, NA…
$ `1915`  <dbl> NA, NA, NA, NA, NA, NA, 6950, 178, 21800, 34900, 1720, NA, NA…
$ `1916`  <dbl> NA, NA, 3.67, NA, NA, NA, 4990.00, 189.00, 19300.00, 8040.00,…
$ `1917`  <dbl> NA, NA, 7.33, NA, NA, NA, 2230.00, 174.00, 20800.00, 3450.00,…
$ `1918`  <dbl> NA, NA, 18.3, NA, NA, NA, 2520.0, 69.5, 23000.0, 3340.0, 671.…
$ `1919`  <dbl> NA, NA, 18.3, NA, NA, NA, 3730.0, 59.4, 21800.0, 3020.0, 573.…
$ `1920`  <dbl> NA, NA, 22.0, NA, NA, NA, 5900.0, 54.2, 25800.0, 14500.0, 523…
$ `1921`  <dbl> NA, NA, 25.7, NA, NA, NA, 5540.0, 58.7, 23200.0, 19400.0, 567…
$ `1922`  <dbl> NA, NA, 25.7, NA, NA, NA, 7300.0, 71.6, 24400.0, 18600.0, 692…
$ `1923`  <dbl> NA, NA, 14.7, NA, NA, NA, 8450.0, 79.1, 24900.0, 17800.0, 764…
$ `1924`  <dbl> NA, NA, 29.3, NA, NA, NA, 11000.0, 94.3, 27100.0, 20100.0, 91…
$ `1925`  <dbl> NA, NA, 33.0, NA, NA, NA, 11200.0, 93.1, 28300.0, 19000.0, 89…
$ `1926`  <dbl> NA, NA, 40.3, NA, NA, NA, 11300.0, 135.0, 27900.0, 18600.0, 1…
$ `1927`  <dbl> NA, NA, 58.7, NA, NA, NA, 13400.0, 168.0, 28900.0, 20100.0, 1…
$ `1928`  <dbl> NA, NA, 73.30, NA, NA, NA, 12800.00, 186.00, 26300.00, 21200.…
$ `1929`  <dbl> NA, NA, 80.70, NA, NA, NA, 13100.00, 201.00, 23700.00, 24200.…
$ `1930`  <dbl> NA, NA, 84.30, NA, NA, NA, 12800.00, 273.00, 22000.00, 18900.…
$ `1931`  <dbl> NA, NA, 99.00, NA, NA, NA, 12900.00, 328.00, 19600.00, 18100.…
$ `1932`  <dbl> NA, NA, 114.00, NA, NA, NA, 13100.00, 369.00, 20400.00, 15200…
$ `1933`  <dbl> NA, 7.33, 121.00, NA, NA, NA, 13200.00, 412.00, 21600.00, 142…
$ `1934`  <dbl> NA, 7.33, 139.00, NA, NA, NA, 14300.00, 499.00, 22700.00, 138…
$ `1935`  <dbl> NA, 18.3, 132.0, NA, NA, NA, 14000.0, 565.0, 25300.0, 13900.0…
$ `1936`  <dbl> NA, 128.0, 51.3, NA, NA, NA, 15100.0, 648.0, 27100.0, 13600.0…
$ `1937`  <dbl> NA, 297.0, 69.7, NA, NA, NA, 16700.0, 662.0, 28900.0, 15300.0…
$ `1938`  <dbl> NA, 348, 33, NA, NA, NA, 16400, 699, 28100, 5790, 6750, NA, 3…
$ `1939`  <dbl> NA, 433.00, 161.00, NA, NA, NA, 17400.00, 707.00, 32200.00, 6…
$ `1940`  <dbl> NA, 693, 238, NA, NA, NA, 15900, 848, 29100, 7350, 8190, NA, …
$ `1941`  <dbl> NA, 627, 312, NA, NA, NA, 14000, 745, 34600, 7980, 7190, NA, …
$ `1942`  <dbl> NA, 744, 499, NA, NA, NA, 13500, 513, 36500, 8560, 4950, NA, …
$ `1943`  <dbl> NA, 462, 469, NA, NA, NA, 14100, 655, 35000, 9620, 6320, NA, …
$ `1944`  <dbl> NA, 154, 499, NA, NA, NA, 14000, 613, 34200, 9400, 5920, NA, …
$ `1945`  <dbl> NA, 121, 616, NA, NA, NA, 13700, 649, 32700, 4570, 6270, NA, …
$ `1946`  <dbl> NA, 484, 763, NA, NA, NA, 13700, 730, 35500, 12800, 7040, NA,…
$ `1947`  <dbl> NA, 928.00, 744.00, NA, NA, NA, 14500.00, 878.00, 38000.00, 1…
$ `1948`  <dbl> NA, 704.00, 803.00, NA, NA, NA, 17400.00, 935.00, 38500.00, 2…
$ `1949`  <dbl> 14.70, 1020.00, 909.00, NA, NA, NA, 15400.00, 1060.00, 37700.…
$ `1950`  <dbl> 84.3, 297.0, 3790.0, NA, 187.0, NA, 30000.0, 1180.0, 54800.0,…
$ `1951`  <dbl> 91.7, 403.0, 4140.0, NA, 249.0, NA, 35000.0, 1280.0, 59100.0,…
$ `1952`  <dbl> 91.7, 374.0, 3890.0, NA, 312.0, NA, 36100.0, 1370.0, 60300.0,…
$ `1953`  <dbl> 106.0, 414.0, 4000.0, NA, 275.0, NA, 35200.0, 1450.0, 59500.0…
$ `1954`  <dbl> 106.0, 502.0, 4160.0, NA, 348.0, NA, 36800.0, 1590.0, 67900.0…
$ `1955`  <dbl> 154.0, 664.0, 4610.0, NA, 414.0, NA, 39600.0, 1800.0, 70700.0…
$ `1956`  <dbl> 183.0, 840.0, 5000.0, NA, 502.0, NA, 44300.0, 1970.0, 73100.0…
$ `1957`  <dbl> 293.0, 1510.0, 5540.0, NA, 620.0, 22.0, 47700.0, 2160.0, 7460…
$ `1958`  <dbl> 330.0, 1200.0, 5220.0, NA, 594.0, 29.3, 44200.0, 2310.0, 7770…
$ `1959`  <dbl> 385.0, 1440.0, 5670.0, NA, 620.0, 29.3, 49000.0, 2430.0, 8380…
$ `1960`  <dbl> 414.0, 2020.0, 6160.0, NA, 550.0, 36.7, 48800.0, 2530.0, 8820…
$ `1961`  <dbl> 491.0, 2280.0, 6070.0, NA, 455.0, 47.7, 51200.0, 2600.0, 9060…
$ `1962`  <dbl> 689.0, 2460.0, 5670.0, NA, 1180.0, 103.0, 53700.0, 2730.0, 94…
$ `1963`  <dbl> 708.0, 2080.0, 5430.0, NA, 1150.0, 84.3, 50100.0, 2930.0, 101…
$ `1964`  <dbl> 840.0, 2020.0, 5650.0, NA, 1220.0, 91.7, 55700.0, 3120.0, 109…
$ `1965`  <dbl> 1010.0, 2170.0, 6600.0, NA, 1190.0, 150.0, 58900.0, 3310.0, 1…
$ `1966`  <dbl> 1090.0, 2550.0, 8430.0, NA, 1550.0, 348.0, 63100.0, 3490.0, 1…
$ `1967`  <dbl> 1280, 2680, 8440, NA, 994, 565, 65500, 3650, 129000, 40000, 3…
$ `1968`  <dbl> 1220, 3070, 9060, NA, 1670, 990, 69100, 3750, 135000, 42400, …
$ `1969`  <dbl> 942, 3250, 11300, NA, 2790, 1260, 77300, 3910, 142000, 44700,…
$ `1970`  <dbl> 1.67e+03, 3.74e+03, 1.51e+04, NA, 3.58e+03, 4.62e+02, 8.27e+0…
$ `1971`  <dbl> 1.90e+03, 4.35e+03, 1.87e+04, NA, 3.41e+03, 4.25e+02, 8.89e+0…
$ `1972`  <dbl> 1.53e+03, 5.64e+03, 2.83e+04, NA, 4.51e+03, 3.74e+02, 9.02e+0…
$ `1973`  <dbl> 1.64e+03, 5.29e+03, 3.83e+04, NA, 4.88e+03, 3.30e+02, 9.41e+0…
$ `1974`  <dbl> 1.92e+03, 4.35e+03, 3.19e+04, NA, 4.87e+03, 4.29e+02, 9.56e+0…
$ `1975`  <dbl> 2.13e+03, 4.59e+03, 3.20e+04, NA, 4.42e+03, 7.08e+02, 9.49e+0…
$ `1976`  <dbl> 1.99e+03, 4.95e+03, 3.92e+04, NA, 3.29e+03, 4.03e+02, 9.98e+0…
$ `1977`  <dbl> 2.39e+03, 5.72e+03, 4.19e+04, NA, 3.53e+03, 4.66e+02, 1.01e+0…
$ `1978`  <dbl> 2160, 6490, 62500, NA, 5410, 491, 103000, 5810, 202000, 57500…
$ `1979`  <dbl> 2240, 7590, 45600, NA, 5500, 407, 111000, 5850, 205000, 61600…
$ `1980`  <dbl> 1760, 5170, 66500, NA, 5350, 143, 109000, 6080, 221000, 52300…
$ `1981`  <dbl> 1980.0, 7340.0, 46400.0, NA, 5280.0, 106.0, 102000.0, 5970.0,…
$ `1982`  <dbl> 2100, 7310, 39300, NA, 4650, 293, 103000, 6080, 234000, 53900…
$ `1983`  <dbl> 2520.0, 7630.0, 52600.0, NA, 5120.0, 84.3, 105000.0, 6170.0, …
$ `1984`  <dbl> 2830.0, 7830.0, 71100.0, NA, 5010.0, 147.0, 107000.0, 6230.0,…
$ `1985`  <dbl> 3510.0, 7880.0, 72800.0, NA, 4700.0, 249.0, 101000.0, 6710.0,…
$ `1986`  <dbl> 3140, 8060, 76300, NA, 4660, 249, 104000, 6730, 240000, 54100…
$ `1987`  <dbl> 3120, 7440, 84100, NA, 5820, 275, 115000, 7020, 256000, 57700…
$ `1988`  <dbl> 2870, 7330, 83900, NA, 5130, 286, 121000, 7210, 261000, 53300…
$ `1989`  <dbl> 2780.0, 8980.0, 80000.0, NA, 5010.0, 286.0, 117000.0, 7060.0,…
$ `1990`  <dbl> 2610, 5520, 77000, 407, 5120, 282, 112000, 6620, 264000, 5770…
$ `1991`  <dbl> 2440, 4290, 79000, 407, 5090, 268, 117000, 6380, 261000, 6160…
$ `1992`  <dbl> 1390, 2520, 80100, 407, 5200, 264, 121000, 5830, 268000, 5670…
$ `1993`  <dbl> 1350, 2340, 82200, 411, 5780, 271, 118000, 2560, 277000, 5710…
$ `1994`  <dbl> 1290, 1930, 86400, 407, 3890, 268, 122000, 2710, 278000, 5710…
$ `1995`  <dbl> 1240, 2090, 95300, 425, 11000, 275, 128000, 3410, 282000, 598…
$ `1996`  <dbl> 1180, 2020, 97100, 455, 10500, 293, 135000, 2560, 302000, 632…
$ `1997`  <dbl> 1100, 1540, 87300, 466, 7380, 308, 138000, 3230, 306000, 6270…
$ `1998`  <dbl> 1040, 1750, 107000, 491, 7310, 319, 140000, 3360, 317000, 637…
$ `1999`  <dbl> 821, 2980, 92000, 513, 9160, 330, 147000, 3010, 325000, 61900…
$ `2000`  <dbl> 774, 3020, 87900, 524, 9540, 345, 142000, 3470, 329000, 62300…
$ `2001`  <dbl> 818, 3220, 84200, 524, 9730, 348, 134000, 3540, 325000, 65900…
$ `2002`  <dbl> 1070, 3750, 89900, 532, 12700, 370, 125000, 3040, 341000, 671…
$ `2003`  <dbl> 1200, 4290, 91600, 535, 9060, 403, 135000, 3430, 336000, 7220…
$ `2004`  <dbl> 950, 4170, 88500, 561, 18800, 422, 158000, 3640, 343000, 7240…
$ `2005`  <dbl> 1330, 4250, 107000, 576, 19200, 429, 162000, 4350, 350000, 74…
$ `2006`  <dbl> 1650, 3900, 101000, 546, 22300, 444, 175000, 4380, 365000, 72…
$ `2007`  <dbl> 2270, 3930, 109000, 539, 25200, 469, 175000, 5060, 372000, 69…
$ `2008`  <dbl> 4210, 4370, 110000, 539, 25700, 480, 189000, 5560, 386000, 69…
$ `2009`  <dbl> 6770, 4380, 121000, 517, 27800, 510, 180000, 4360, 395000, 62…
$ `2010`  <dbl> 8460, 4600, 119000, 517, 29100, 524, 188000, 4220, 391000, 67…
$ `2011`  <dbl> 12200, 5240, 121000, 491, 30300, 513, 192000, 4920, 392000, 6…
$ `2012`  <dbl> 10800, 4910, 130000, 488, 33400, 524, 192000, 5690, 388000, 6…
$ `2013`  <dbl> 10000, 5060, 134000, 477, 32600, 524, 190000, 5500, 372000, 6…
$ `2014`  <dbl> 9810, 5720, 145000, 462, 34800, 532, 204000, 5530, 361000, 58…

Indicator n 1 CO2 Emissions (Mg) 57246 2 Deaths/1000 People 57246 3 Disasters 40 4 Energy Use (kg, oil-eq./capita) 57246 5 GDP Growth/Capita (%) 57246 6 Temperature (Fahrenheit) 116

We can see that we have a large tibble. A tibble is the tidyverse version of a data frame. It is essentially a table with variable information arranged as columns, and individual observations arranged as rows. We can see that the tibble gives us information about the class of each variable. For example the country variable is made up of character (abbreviated as chr) values. We see that we have 265 different country variables and CO2 emission values for 192 different years (from 1751 to 2014). Recall that the values are emissions in metric tons also called tonnes. We can see that there are fewer NA values for later years.

Now we will modify this data to make it more usable for making visualizations. One thing we will use is the %<>% opperator which is from the magrittr package. This allows us to use our CO2_emissions data and reassign it to a modified version at the same time.

We will use the pivot_longer() function of the dplyr package to convert our data into what is called long format. This means that we will have more rows and fewer columns than our current format. This is done by collapsing multiple variables into fewer variables.

We want to collapse all of the values for the emission data across the different individual year variables into one new emission variable and we will identify what year they are from using a new Year variable.

# A tibble: 6 x 3
  country     Year  Emissions
  <chr>       <chr>     <dbl>
1 Afghanistan 1751         NA
2 Afghanistan 1752         NA
3 Afghanistan 1753         NA
4 Afghanistan 1754         NA
5 Afghanistan 1755         NA
6 Afghanistan 1756         NA

We also want to rename the country variable to be capitalized. W We can use the rename() function of the dplyr package to rename this variable. When renaming variables the new name is listed first before the =. We will also modify the Emissions data by dividing it by 1000 to make the numbers smaller. To do this we will use the mutate() function, which is also part of the dplyr() package. This function allows us to create and modify variables. You may also note that the Year variable is currently of class type character. We would like to change it to be numeric. This can also be accomplished using the mutate() function.

Now let’s take a look to see how our data has changed:

# A tibble: 6 x 3
  Country      Year Emissions
  <chr>       <dbl>     <dbl>
1 Afghanistan  1751        NA
2 Afghanistan  1752        NA
3 Afghanistan  1753        NA
4 Afghanistan  1754        NA
5 Afghanistan  1755        NA
6 Afghanistan  1756        NA

Great, we can see that now the Year variable is of class double (abbreviated dbl), which is a numeric class.

Yearly Growth in GDP per Capita

# A tibble: 6 x 220
  country   `1801`   `1802`   `1803`   `1804`   `1805`   `1806`   `1807`
  <chr>      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 Afghan… NA       NA       NA       NA       NA       NA       NA      
2 Albania  0.104    0.104    0.104    0.104    0.104    0.104    0.104  
3 Algeria -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247
4 Andorra  0.166    0.166    0.166    0.166    0.166    0.166    0.166  
5 Angola   0.425    0.425    0.425    0.425    0.425    0.425    0.425  
6 Antigu… NA       NA       NA       NA       NA       NA       NA      
# … with 212 more variables: `1808` <dbl>, `1809` <dbl>, `1810` <dbl>,
#   `1811` <dbl>, `1812` <dbl>, `1813` <dbl>, `1814` <dbl>, `1815` <dbl>,
#   `1816` <dbl>, `1817` <dbl>, `1818` <dbl>, `1819` <dbl>, `1820` <dbl>,
#   `1821` <dbl>, `1822` <dbl>, `1823` <dbl>, `1824` <dbl>, `1825` <dbl>,
#   `1826` <dbl>, `1827` <dbl>, `1828` <dbl>, `1829` <dbl>, `1830` <dbl>,
#   `1831` <dbl>, `1832` <dbl>, `1833` <dbl>, `1834` <dbl>, `1835` <dbl>,
#   `1836` <dbl>, `1837` <dbl>, `1838` <dbl>, `1839` <dbl>, `1840` <dbl>,
#   `1841` <dbl>, `1842` <dbl>, `1843` <dbl>, `1844` <dbl>, `1845` <dbl>,
#   `1846` <dbl>, `1847` <dbl>, `1848` <dbl>, `1849` <dbl>, `1850` <dbl>,
#   `1851` <dbl>, `1852` <dbl>, `1853` <dbl>, `1854` <dbl>, `1855` <dbl>,
#   `1856` <dbl>, `1857` <dbl>, `1858` <dbl>, `1859` <dbl>, `1860` <dbl>,
#   `1861` <dbl>, `1862` <dbl>, `1863` <dbl>, `1864` <dbl>, `1865` <dbl>,
#   `1866` <dbl>, `1867` <dbl>, `1868` <dbl>, `1869` <dbl>, `1870` <dbl>,
#   `1871` <dbl>, `1872` <dbl>, `1873` <dbl>, `1874` <dbl>, `1875` <dbl>,
#   `1876` <dbl>, `1877` <dbl>, `1878` <dbl>, `1879` <dbl>, `1880` <dbl>,
#   `1881` <dbl>, `1882` <dbl>, `1883` <dbl>, `1884` <dbl>, `1885` <dbl>,
#   `1886` <dbl>, `1887` <dbl>, `1888` <dbl>, `1889` <dbl>, `1890` <dbl>,
#   `1891` <dbl>, `1892` <dbl>, `1893` <dbl>, `1894` <dbl>, `1895` <dbl>,
#   `1896` <dbl>, `1897` <dbl>, `1898` <dbl>, `1899` <dbl>, `1900` <dbl>,
#   `1901` <dbl>, `1902` <dbl>, `1903` <dbl>, `1904` <dbl>, `1905` <dbl>,
#   `1906` <dbl>, `1907` <dbl>, …
  [1] "country" "1801"    "1802"    "1803"    "1804"    "1805"    "1806"   
  [8] "1807"    "1808"    "1809"    "1810"    "1811"    "1812"    "1813"   
 [15] "1814"    "1815"    "1816"    "1817"    "1818"    "1819"    "1820"   
 [22] "1821"    "1822"    "1823"    "1824"    "1825"    "1826"    "1827"   
 [29] "1828"    "1829"    "1830"    "1831"    "1832"    "1833"    "1834"   
 [36] "1835"    "1836"    "1837"    "1838"    "1839"    "1840"    "1841"   
 [43] "1842"    "1843"    "1844"    "1845"    "1846"    "1847"    "1848"   
 [50] "1849"    "1850"    "1851"    "1852"    "1853"    "1854"    "1855"   
 [57] "1856"    "1857"    "1858"    "1859"    "1860"    "1861"    "1862"   
 [64] "1863"    "1864"    "1865"    "1866"    "1867"    "1868"    "1869"   
 [71] "1870"    "1871"    "1872"    "1873"    "1874"    "1875"    "1876"   
 [78] "1877"    "1878"    "1879"    "1880"    "1881"    "1882"    "1883"   
 [85] "1884"    "1885"    "1886"    "1887"    "1888"    "1889"    "1890"   
 [92] "1891"    "1892"    "1893"    "1894"    "1895"    "1896"    "1897"   
 [99] "1898"    "1899"    "1900"    "1901"    "1902"    "1903"    "1904"   
[106] "1905"    "1906"    "1907"    "1908"    "1909"    "1910"    "1911"   
[113] "1912"    "1913"    "1914"    "1915"    "1916"    "1917"    "1918"   
[120] "1919"    "1920"    "1921"    "1922"    "1923"    "1924"    "1925"   
[127] "1926"    "1927"    "1928"    "1929"    "1930"    "1931"    "1932"   
[134] "1933"    "1934"    "1935"    "1936"    "1937"    "1938"    "1939"   
[141] "1940"    "1941"    "1942"    "1943"    "1944"    "1945"    "1946"   
[148] "1947"    "1948"    "1949"    "1950"    "1951"    "1952"    "1953"   
[155] "1954"    "1955"    "1956"    "1957"    "1958"    "1959"    "1960"   
[162] "1961"    "1962"    "1963"    "1964"    "1965"    "1966"    "1967"   
[169] "1968"    "1969"    "1970"    "1971"    "1972"    "1973"    "1974"   
[176] "1975"    "1976"    "1977"    "1978"    "1979"    "1980"    "1981"   
[183] "1982"    "1983"    "1984"    "1985"    "1986"    "1987"    "1988"   
[190] "1989"    "1990"    "1991"    "1992"    "1993"    "1994"    "1995"   
[197] "1996"    "1997"    "1998"    "1999"    "2000"    "2001"    "2002"   
[204] "2003"    "2004"    "2005"    "2006"    "2007"    "2008"    "2009"   
[211] "2010"    "2011"    "2012"    "2013"    "2014"    "2015"    "2016"   
[218] "2017"    "2018"    "2019"   

Rows: 194
Columns: 220
$ country <chr> "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "An…
$ `1801`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1802`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1803`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1804`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1805`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1806`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1807`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1808`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1809`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1810`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1811`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1812`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1813`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1814`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1815`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1816`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1817`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1818`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1819`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1820`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1821`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1822`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1823`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1824`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1825`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1826`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1827`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1828`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1829`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1830`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1831`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1832`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1833`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1834`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1835`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1836`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1837`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1838`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1839`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1840`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1841`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1842`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1843`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1844`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1845`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1846`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1847`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1848`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1849`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1850`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1851`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1852`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1853`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1854`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1855`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1856`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1857`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1858`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1859`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1860`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1861`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1862`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1863`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1864`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1865`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1866`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1867`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1868`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1869`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1870`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1871`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 0.772…
$ `1872`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 1.4100, 0.371…
$ `1873`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 7.600…
$ `1874`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 0.292…
$ `1875`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 7.910…
$ `1876`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -0.952, 0.371, -3.1…
$ `1877`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 7.210, 0.371, 0.720…
$ `1878`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -8.110, 0.371, 5.98…
$ `1879`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 1.2700, 0.371…
$ `1880`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -5.020, 0.371, 1.91…
$ `1881`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -1.500, 0.371, 3.95…
$ `1882`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 22.8000, 0.37…
$ `1883`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 9.000, 0.371, 10.20…
$ `1884`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 3.980, 0.371, -3.84…
$ `1885`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 14.2000, 0.37…
$ `1886`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -2.700, -4.080, -2.…
$ `1887`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 3.690, 16.700, 6.98…
$ `1888`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 12.900, -4.020, -2.…
$ `1889`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 6.590, -7.220, 5.40…
$ `1890`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -11.300, -0.635, -6…
$ `1891`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, -8.460, -8.610, 4.6…
$ `1892`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 16.300, 9.230, -14.…
$ `1893`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 2.840, 13.100, -7.2…
$ `1894`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 12.200, 13.400, 1.5…
$ `1895`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 7.760, -7.670, -7.3…
$ `1896`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 7.520, 9.890, 5.670…
$ `1897`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, -21.900, -1.890, -7…
$ `1898`  <dbl> 0.3250, 1.3700, 1.1400, 1.1700, 0.4250, 0.6610, 5.4600, 2.430…
$ `1899`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 14.700, 5.880, -1.3…
$ `1900`  <dbl> 0.3250, 1.3700, 1.1400, 1.1700, 0.4250, 0.6610, -14.8000, -2.…
$ `1901`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 5.620, 2.270, -4.35…
$ `1902`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, -4.850, 8.420, -0.4…
$ `1903`  <dbl> 0.3250, 1.3100, 1.1400, 1.1700, 0.4250, 0.6610, 11.5000, -7.1…
$ `1904`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 7.830, 10.300, 5.36…
$ `1905`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 10.400, -11.700, -0…
$ `1906`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 0.392, -4.640, 5.26…
$ `1907`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, -2.530, -4.130, 2.4…
$ `1908`  <dbl> 0.3250, 1.3100, 1.1400, 1.1700, 0.4250, 0.6610, 5.1600, 8.960…
$ `1909`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 0.294, 3.590, 6.130…
$ `1910`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 2.640, 6.460, 4.600…
$ `1911`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, -2.2000…
$ `1912`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, 4.17000…
$ `1913`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, -2.9600…
$ `1914`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -14.300, -4.720, -2…
$ `1915`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -3.470, 2.690, -2.5…
$ `1916`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -4.610, -3.150, -0.…
$ `1917`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -9.830, -16.700, -1…
$ `1918`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 16.600, -16.700, -3…
$ `1919`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 1.950, -16.700, 2.4…
$ `1920`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 5.550, -5.070, 1.06…
$ `1921`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -0.488, -5.070, 3.0…
$ `1922`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.950, 8.450, 3.110…
$ `1923`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 7.970, 8.450, 2.540…
$ `1924`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.750, 8.450, 4.340…
$ `1925`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -3.460, 8.450, 2.50…
$ `1926`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 2.080, 8.450, 0.351…
$ `1927`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.350, 8.450, -0.51…
$ `1928`  <dbl> 0.46300, 0.83700, 0.43200, 3.80000, 2.96000, 2.45000, 3.45000…
$ `1929`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 1.860, 8.450, -3.46…
$ `1930`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -6.880, 4.280, -10.…
$ `1931`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -8.810, 0.680, -7.5…
$ `1932`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -5.180, -1.760, 4.8…
$ `1933`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.830, 3.530, 6.110…
$ `1934`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 6.020, 8.930, 4.490…
$ `1935`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.480, 14.100, 5.09…
$ `1936`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -0.737, 6.560, 3.73…
$ `1937`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 5.680, 8.050, 4.170…
$ `1938`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -1.260, -0.505, 2.4…
$ `1939`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.260, 3.820, -0.69…
$ `1940`  <dbl> 0.4630, 0.3720, 0.4320, 3.8000, 2.9600, 2.4500, 0.0522, -4.38…
$ `1941`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 3.670, -2.100, 10.1…
$ `1942`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -0.457, -2.100, 10.…
$ `1943`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -2.240, -2.100, 2.6…
$ `1944`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 9.710, -2.100, -4.4…
$ `1945`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -4.770, -2.100, -6.…
$ `1946`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 6.610, -2.100, -4.6…
$ `1947`  <dbl> 0.4630, 0.3720, 0.4320, 3.8000, 2.9600, 2.4500, 8.8000, 10.90…
$ `1948`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 3.160, 12.700, 4.55…
$ `1949`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -3.620, 8.980, 3.87…
$ `1950`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -1.110, 8.070, 2.42…
$ `1951`  <dbl> 1.250, 4.320, -1.300, 3.800, 2.320, 2.450, 1.750, -1.470, 1.2…
$ `1952`  <dbl> 1.660, 0.160, 2.150, 3.800, 2.320, 2.450, -7.090, 4.430, -1.1…
$ `1953`  <dbl> 4.290, 4.040, -0.517, 3.800, 2.220, 2.450, 3.320, 2.360, 1.18…
$ `1954`  <dbl> 0.3080, 2.9400, 4.9900, 3.8000, -4.1100, 2.4500, 2.2100, 2.87…
$ `1955`  <dbl> 0.129, 5.390, 0.573, 3.800, 6.410, 2.450, 5.200, 6.420, 3.040…
$ `1956`  <dbl> 2.530, 1.010, 7.460, 3.800, -3.350, 2.450, 0.962, 7.410, 1.01…
$ `1957`  <dbl> -1.9400, 6.4100, 9.0300, 3.8000, 7.8600, 2.4500, 3.4200, 0.04…
$ `1958`  <dbl> 3.520, 4.500, 1.510, 3.800, 3.620, 2.450, 4.390, 5.390, 2.660…
$ `1959`  <dbl> 0.764, 4.120, 16.000, 3.800, -1.230, 2.450, -8.140, -3.080, 3…
$ `1960`  <dbl> 1.430, 5.060, 4.750, 3.800, 2.260, 2.450, 6.220, 7.290, 1.880…
$ `1961`  <dbl> -1.280, 0.831, -13.800, 3.800, 11.400, 2.450, 5.480, 3.870, -…
$ `1962`  <dbl> -0.497, 3.310, -20.400, 3.800, -4.360, 2.450, -3.180, 1.030, …
$ `1963`  <dbl> -0.429, 3.410, 23.400, 3.800, 3.380, 2.450, -3.930, -3.740, 4…
$ `1964`  <dbl> -0.374, 3.420, 2.160, 3.800, 9.360, 2.450, 8.760, 11.400, 4.7…
$ `1965`  <dbl> -0.124, 3.650, 3.530, 3.800, 5.710, 2.450, 7.640, 4.390, 3.08…
$ `1966`  <dbl> -1.370, 3.750, -7.730, 3.800, 4.040, 2.450, -0.829, 3.670, 0.…
$ `1967`  <dbl> 0.310, 3.760, 5.740, 3.800, 4.040, 2.450, 1.220, 3.310, 4.800…
$ `1968`  <dbl> 1.06, 3.61, 8.40, 3.80, -3.19, 2.45, 2.87, 4.81, 3.87, 3.90, …
$ `1969`  <dbl> -0.883, 3.400, 6.480, 3.800, 1.150, 2.450, 7.080, 0.450, 3.70…
$ `1970`  <dbl> -0.514, 3.690, 6.830, 3.800, 4.510, 2.450, 3.850, 6.690, 4.00…
$ `1971`  <dbl> -7.160, 4.000, -11.100, -0.603, 3.880, 4.800, 2.130, 1.650, 2…
$ `1972`  <dbl> -4.360, 3.920, 17.500, 2.760, -1.970, 4.720, 0.370, -0.430, 0…
$ `1973`  <dbl> 8.580, 4.980, 0.285, 2.630, 5.680, 6.090, 2.020, 7.380, 3.820…
$ `1974`  <dbl> 2.750, 0.373, 3.010, 0.870, 0.714, 1.700, 3.700, 1.070, 0.831…
$ `1975`  <dbl> 2.5300, 0.3480, 3.8900, -3.5900, -7.3700, -6.2900, -2.2400, -…
$ `1976`  <dbl> 2.330, 0.400, 3.420, -0.531, -7.630, -8.910, -1.580, 2.850, 2…
$ `1977`  <dbl> -9.2400, 0.4380, 5.7700, -0.6340, -1.8700, 8.2100, 4.8600, 0.…
$ `1978`  <dbl> 5.210, 0.460, 9.420, -1.920, -7.870, 4.990, -4.730, 0.760, 1.…
$ `1979`  <dbl> -2.180, 0.487, 5.750, -3.670, -2.600, 12.600, 5.440, -2.140, …
$ `1980`  <dbl> 0.1680, 0.7060, -1.2600, -2.1000, -0.4710, 8.3500, 0.0163, -1…
$ `1981`  <dbl> 10.700, 0.536, -0.656, -4.970, -7.610, 6.330, -6.960, -0.756,…
$ `1982`  <dbl> 9.0500, 0.5500, 3.0800, -4.0500, -3.5200, 1.5500, -4.5000, 0.…
$ `1983`  <dbl> 3.59000, 0.58400, 1.89000, -3.47000, 0.52000, 8.03000, 2.6700…
$ `1984`  <dbl> -1.830, 0.569, 2.270, -2.810, 2.440, 8.850, 0.681, -0.516, 5.…
$ `1985`  <dbl> -3.280, 0.523, 2.020, -1.370, 0.316, 9.540, -8.340, -0.847, 3…
$ `1986`  <dbl> 7.170, 0.635, -3.790, 0.612, 0.332, 10.700, 5.880, 2.330, 0.6…
$ `1987`  <dbl> -17.3000, 0.6290, -3.3100, 3.7300, 4.3100, 11.3000, 1.2500, -…
$ `1988`  <dbl> -9.660, 0.633, -4.670, 3.540, 3.020, 10.000, -3.220, 0.453, 2…
$ `1989`  <dbl> -2.410, 0.754, 0.771, 2.780, -2.140, 7.540, -8.340, 0.135, 2.…
$ `1990`  <dbl> -5.5800, 0.8930, -3.9100, 0.8110, -3.1700, 3.2300, -3.2200, -…
$ `1991`  <dbl> -0.572, -28.900, -3.490, -1.470, -2.030, 1.540, 9.290, -13.30…
$ `1992`  <dbl> -7.950, -8.100, -0.752, -3.740, -8.830, -0.632, 8.540, -40.80…
$ `1993`  <dbl> -13.900, 8.780, -4.440, -5.650, -26.400, 3.080, 4.660, -4.660…
$ `1994`  <dbl> -10.400, 7.440, -3.070, -1.650, -1.860, 3.660, 4.770, 8.960, …
$ `1995`  <dbl> 20.300, 12.600, 1.710, -0.114, 11.600, -6.630, -3.910, 8.900,…
$ `1996`  <dbl> 2.660, 8.650, 1.940, 3.090, 16.600, 3.900, 4.460, 6.080, 2.48…
$ `1997`  <dbl> 2.8200, -10.6000, -0.5580, 8.5900, 2.7000, 2.3400, 7.0500, 3.…
$ `1998`  <dbl> 2.8300, 12.3000, 3.5000, 3.3000, -2.6300, 1.8200, 2.7900, 7.6…
$ `1999`  <dbl> 2.7100, 9.5800, 1.6800, 4.0100, 0.3870, 1.6900, -4.4500, 3.35…
$ `2000`  <dbl> -1.0500, 6.7900, 0.9950, 0.4010, -0.0561, -0.6830, -1.8500, 6…
$ `2001`  <dbl> -10.400, 6.690, 1.130, 10.000, -0.171, 0.251, -5.470, 10.100,…
$ `2002`  <dbl> 22.1000, 2.8600, 2.5500, 3.5800, 10.7000, 0.8110, -12.0000, 1…
$ `2003`  <dbl> 8.040, 5.450, 5.460, 4.170, -0.247, 3.670, 7.770, 14.400, 3.0…
$ `2004`  <dbl> 2.5000, 5.3600, 3.8400, 4.1800, 7.4500, 5.7500, 7.9200, 10.90…
$ `2005`  <dbl> 8.6100, 4.9600, 3.8000, 4.2100, 16.6000, 3.2900, 8.1200, 14.3…
$ `2006`  <dbl> 1.590, 5.270, 0.188, 2.370, 15.000, 11.300, 7.250, 13.100, 1.…
$ `2007`  <dbl> 10.800, 5.410, 1.850, -1.700, 19.600, 5.780, 7.440, 13.600, 2…
$ `2008`  <dbl> 0.117, 6.840, 0.472, -5.600, 10.600, 0.378, 5.570, 6.690, 0.7…
$ `2009`  <dbl> 17.300, 2.910, 0.179, -6.310, -0.464, -11.700, -0.276, -15.00…
$ `2010`  <dbl> 5.1700, 2.9800, 2.0600, -4.7800, 0.5940, -8.5300, 7.9400, 1.1…
$ `2011`  <dbl> 3.8500, 2.4900, 0.8570, -4.3000, 1.0300, -2.9600, 7.6500, 3.6…
$ `2012`  <dbl> 11.200, 2.280, 1.160, NA, 2.130, 2.790, 0.761, 6.920, 1.780, …
$ `2013`  <dbl> 1.130, 1.720, 1.610, NA, 1.030, 0.468, 3.090, 2.980, 1.170, 0…
$ `2014`  <dbl> 0.837, 2.610, 2.180, NA, 2.240, 1.620, -0.622, 4.050, 1.410, …
$ `2015`  <dbl> 2.110, 3.820, 2.100, NA, 2.460, 1.900, -0.128, 4.290, 1.480, …
$ `2016`  <dbl> 2.680, 4.720, 2.360, NA, 2.770, 2.200, 0.367, 4.490, 1.730, 1…
$ `2017`  <dbl> 2.760, 5.030, 2.500, NA, 0.262, 2.200, 0.861, 4.790, 1.700, 1…
$ `2018`  <dbl> 3.020, 5.030, 2.630, NA, 3.460, 2.200, 0.861, 4.790, 1.710, 1…
$ `2019`  <dbl> 3.380, 5.230, 2.680, NA, 3.550, 2.200, 0.861, 4.790, 1.770, 0…

Again, we will use the pivot_longer() to transform the data to long format. We will also again change the country variable to be Country by using the rename() function , and we will make the Year varaible numeric using the mutate() function.

AVOCADO… this was in Michael’s code… but I don’t know that we need it We will use the drop_na() function of the tidyr package to drop all years with missing data.

Now let’s see how this data has changed:

# A tibble: 6 x 3
  Country      Year `GDP Growth/Capita (%)`
  <chr>       <dbl>                   <dbl>
1 Afghanistan  1801                      NA
2 Afghanistan  1802                      NA
3 Afghanistan  1803                      NA
4 Afghanistan  1804                      NA
5 Afghanistan  1805                      NA
6 Afghanistan  1806                      NA
# A tibble: 219 x 2
    Year     n
   <dbl> <int>
 1  1801   194
 2  1802   194
 3  1803   194
 4  1804   194
 5  1805   194
 6  1806   194
 7  1807   194
 8  1808   194
 9  1809   194
10  1810   194
# … with 209 more rows

Energy Use per Person

Now let’s take a look at the energy use per person data:

# A tibble: 6 x 57
  country `1960` `1961` `1962` `1963` `1964` `1965` `1966` `1967` `1968` `1969`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Argent…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Armenia     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 46 more variables: `1970` <dbl>, `1971` <dbl>, `1972` <dbl>,
#   `1973` <dbl>, `1974` <dbl>, `1975` <dbl>, `1976` <dbl>, `1977` <dbl>,
#   `1978` <dbl>, `1979` <dbl>, `1980` <dbl>, `1981` <dbl>, `1982` <dbl>,
#   `1983` <dbl>, `1984` <dbl>, `1985` <dbl>, `1986` <dbl>, `1987` <dbl>,
#   `1988` <dbl>, `1989` <dbl>, `1990` <dbl>, `1991` <dbl>, `1992` <dbl>,
#   `1993` <dbl>, `1994` <dbl>, `1995` <dbl>, `1996` <dbl>, `1997` <dbl>,
#   `1998` <dbl>, `1999` <dbl>, `2000` <dbl>, `2001` <dbl>, `2002` <dbl>,
#   `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, `2006` <dbl>, `2007` <dbl>,
#   `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#   `2013` <dbl>, `2014` <dbl>, `2015` <dbl>

Rows: 169
Columns: 57
$ country <chr> "Albania", "Algeria", "Angola", "Antigua and Barbuda", "Argen…
$ `1960`  <dbl> NA, NA, NA, NA, NA, NA, 3060, 1550, NA, NA, NA, NA, NA, NA, 2…
$ `1961`  <dbl> NA, NA, NA, NA, NA, NA, 3120, 1550, NA, NA, NA, NA, NA, NA, 2…
$ `1962`  <dbl> NA, NA, NA, NA, NA, NA, 3170, 1680, NA, NA, NA, NA, NA, NA, 2…
$ `1963`  <dbl> NA, NA, NA, NA, NA, NA, 3280, 1820, NA, NA, NA, NA, NA, NA, 3…
$ `1964`  <dbl> NA, NA, NA, NA, NA, NA, 3350, 1860, NA, NA, NA, NA, NA, NA, 3…
$ `1965`  <dbl> NA, NA, NA, NA, NA, NA, 3460, 1850, NA, NA, NA, NA, NA, NA, 3…
$ `1966`  <dbl> NA, NA, NA, NA, NA, NA, 3550, 1900, NA, NA, NA, NA, NA, NA, 3…
$ `1967`  <dbl> NA, NA, NA, NA, NA, NA, 3690, 1920, NA, NA, NA, NA, NA, NA, 3…
$ `1968`  <dbl> NA, NA, NA, NA, NA, NA, 3760, 2050, NA, NA, NA, NA, NA, NA, 3…
$ `1969`  <dbl> NA, NA, NA, NA, NA, NA, 3790, 2180, NA, NA, NA, NA, NA, NA, 3…
$ `1970`  <dbl> NA, NA, NA, NA, NA, NA, 4060, 2420, NA, NA, NA, NA, NA, NA, 4…
$ `1971`  <dbl> 785.0, 232.0, 556.0, NA, 1380.0, NA, 3990.0, 2510.0, NA, NA, …
$ `1972`  <dbl> 866.0, 261.0, 584.0, NA, 1380.0, NA, 4040.0, 2630.0, NA, NA, …
$ `1973`  <dbl> 763.0, 305.0, 568.0, NA, 1410.0, NA, 4260.0, 2830.0, NA, NA, …
$ `1974`  <dbl> 777.0, 319.0, 565.0, NA, 1420.0, NA, 4290.0, 2730.0, NA, NA, …
$ `1975`  <dbl> 827.0, 330.0, 536.0, NA, 1380.0, NA, 4350.0, 2650.0, NA, NA, …
$ `1976`  <dbl> 891, 367, 515, NA, 1400, NA, 4410, 2870, NA, NA, 9580, 98, NA…
$ `1977`  <dbl> 924.0, 399.0, 494.0, NA, 1420.0, NA, 4670.0, 2800.0, NA, NA, …
$ `1978`  <dbl> 1010.0, 477.0, 527.0, NA, 1430.0, NA, 4630.0, 2890.0, NA, NA,…
$ `1979`  <dbl> 864.0, 586.0, 518.0, NA, 1480.0, NA, 4680.0, 3140.0, NA, NA, …
$ `1980`  <dbl> 1150, 579, 511, NA, 1490, NA, 4740, 3070, NA, NA, 7790, 103, …
$ `1981`  <dbl> 989, 611, 497, NA, 1430, NA, 4690, 2900, NA, NA, 8300, 102, N…
$ `1982`  <dbl> 967, 771, 473, NA, 1420, NA, 4820, 2830, NA, NA, 9070, 105, N…
$ `1983`  <dbl> 1000, 808, 469, NA, 1420, NA, 4560, 2840, NA, NA, 8500, 105, …
$ `1984`  <dbl> 1020, 776, 458, NA, 1450, NA, 4650, 2950, NA, NA, 8830, 104, …
$ `1985`  <dbl> 917, 786, 470, NA, 1360, NA, 4600, 3050, NA, NA, 9920, 107, N…
$ `1986`  <dbl> 964, 862, 462, NA, 1420, NA, 4620, 3060, NA, NA, 10300, 111, …
$ `1987`  <dbl> 922, 828, 461, NA, 1480, NA, 4770, 3170, NA, NA, 9520, 107, N…
$ `1988`  <dbl> 928, 850, 467, NA, 1500, NA, 4700, 3200, NA, NA, 10500, 114, …
$ `1989`  <dbl> 896, 820, 465, NA, 1440, NA, 5000, 3140, NA, NA, 10200, 117, …
$ `1990`  <dbl> 813, 856, 483, 1480, 1410, 2180, 5060, 3240, 3170, 2520, 1060…
$ `1991`  <dbl> 573, 884, 480, NA, 1430, 2320, 4930, 3420, 3090, NA, 10100, 1…
$ `1992`  <dbl> 418, 884, 467, NA, 1480, 1200, 4960, 3250, 2460, NA, 10800, 1…
$ `1993`  <dbl> 412, 868, 468, NA, 1470, 652, 5150, 3260, 2180, NA, 11100, 12…
$ `1994`  <dbl> 441, 819, 459, NA, 1540, 420, 5090, 3230, 1950, NA, 11600, 12…
$ `1995`  <dbl> 417, 839, 445, NA, 1540, 511, 5130, 3370, 1810, NA, 11400, 13…
$ `1996`  <dbl> 448, 798, 445, NA, 1580, 562, 5390, 3580, 1510, NA, 11100, 13…
$ `1997`  <dbl> 385, 805, 443, NA, 1610, 594, 5470, 3550, 1440, NA, 12200, 13…
$ `1998`  <dbl> 427, 821, 430, NA, 1650, 610, 5550, 3610, 1490, NA, 12400, 13…
$ `1999`  <dbl> 576, 864, 439, NA, 1660, 594, 5610, 3590, 1370, NA, 11900, 13…
$ `2000`  <dbl> 580, 866, 437, NA, 1660, 656, 5640, 3570, 1400, NA, 12000, 13…
$ `2001`  <dbl> 597, 856, 442, NA, 1560, 657, 5450, 3760, 1410, NA, 11700, 14…
$ `2002`  <dbl> 660, 904, 447, NA, 1500, 618, 5570, 3770, 1410, NA, 11500, 15…
$ `2003`  <dbl> 648, 949, 466, NA, 1590, 657, 5570, 3970, 1480, NA, 11600, 15…
$ `2004`  <dbl> 715, 948, 462, 1530, 1720, 698, 5600, 4010, 1540, 2060, 10900…
$ `2005`  <dbl> 720, 974, 431, 1530, 1710, 843, 5560, 4090, 1600, 2110, 11700…
$ `2006`  <dbl> 707, 1030, 456, 1580, 1840, 865, 5710, 4080, 1560, 2100, 1160…
$ `2007`  <dbl> 680, 1070, 470, 1600, 1850, 973, 5870, 4020, 1410, 2070, 1120…
$ `2008`  <dbl> 711, 1070, 491, NA, 1920, 1030, 5960, 4030, 1520, NA, 11300, …
$ `2009`  <dbl> 732, 1150, 514, NA, 1850, 904, 5860, 3800, 1330, NA, 10300, 1…
$ `2010`  <dbl> 729, 1110, 521, NA, 1910, 863, 5790, 4050, 1280, NA, 10200, 2…
$ `2011`  <dbl> 765, 1140, 522, NA, 1930, 944, 5750, 3920, 1370, NA, 9910, 20…
$ `2012`  <dbl> 688, 1220, 553, NA, 1920, 1030, 5570, 3890, 1470, NA, 9660, 2…
$ `2013`  <dbl> 801, 1240, 534, NA, 1950, 1000, 5460, 3920, 1470, NA, 10400, …
$ `2014`  <dbl> 808, 1320, 545, NA, 2020, 1020, 5330, 3760, 1500, NA, 10600, …
$ `2015`  <dbl> NA, NA, NA, NA, NA, NA, 5480, 3800, NA, NA, NA, NA, NA, NA, 4…

To wrangle the energy_use data, we will again convert the data to long format, rename some variables, and mutate the Year data to be numeric.

Rows: 9,464
Columns: 3
$ Country                           <chr> "Albania", "Albania", "Albania", "A…
$ Year                              <dbl> 1960, 1961, 1962, 1963, 1964, 1965,…
$ `Energy Use (kg, oil-eq./capita)` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA,…

Crude Mortality Rate

# A tibble: 6 x 64
  `Data Source` `World Developm… ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
  <chr>         <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Last Updated… 43819            <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
2 <NA>          <NA>             <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
3 Country Name  Country Code     Indi… Indi… 1960  1961  1962  1963  1964  1965 
4 Aruba         ABW              Deat… SP.D… 6.38… 6.24… 6.11… 6.01… 5.91… 5.83…
5 Afghanistan   AFG              Deat… SP.D… 32.2… 31.6… 31.0… 30.5… 30.0… 29.5…
6 Angola        AGO              Deat… SP.D… 27.0… 26.8… 26.6… 26.4… 26.1… 25.9…
# … with 54 more variables: ...11 <chr>, ...12 <chr>, ...13 <chr>, ...14 <chr>,
#   ...15 <chr>, ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>,
#   ...20 <chr>, ...21 <chr>, ...22 <chr>, ...23 <chr>, ...24 <chr>,
#   ...25 <chr>, ...26 <chr>, ...27 <chr>, ...28 <chr>, ...29 <chr>,
#   ...30 <chr>, ...31 <chr>, ...32 <chr>, ...33 <chr>, ...34 <chr>,
#   ...35 <chr>, ...36 <chr>, ...37 <chr>, ...38 <chr>, ...39 <chr>,
#   ...40 <chr>, ...41 <chr>, ...42 <chr>, ...43 <chr>, ...44 <chr>,
#   ...45 <chr>, ...46 <chr>, ...47 <chr>, ...48 <chr>, ...49 <chr>,
#   ...50 <chr>, ...51 <chr>, ...52 <chr>, ...53 <chr>, ...54 <chr>,
#   ...55 <chr>, ...56 <chr>, ...57 <chr>, ...58 <chr>, ...59 <chr>,
#   ...60 <chr>, ...61 <chr>, ...62 <chr>, ...63 <chr>, ...64 <chr>

We can see that there are a couple of empty rows which indicate when the data was updated. We can also see that the columns really start at the 3rd row. So first we will repace the column names with the 3rd row. Then we will remove the first 3 rows.

 [1] "Data Source"                  "World Development Indicators"
 [3] "...3"                         "...4"                        
 [5] "...5"                         "...6"                        
 [7] "...7"                         "...8"                        
 [9] "...9"                         "...10"                       
[11] "...11"                        "...12"                       
[13] "...13"                        "...14"                       
[15] "...15"                        "...16"                       
[17] "...17"                        "...18"                       
[19] "...19"                        "...20"                       
[21] "...21"                        "...22"                       
[23] "...23"                        "...24"                       
[25] "...25"                        "...26"                       
[27] "...27"                        "...28"                       
[29] "...29"                        "...30"                       
[31] "...31"                        "...32"                       
[33] "...33"                        "...34"                       
[35] "...35"                        "...36"                       
[37] "...37"                        "...38"                       
[39] "...39"                        "...40"                       
[41] "...41"                        "...42"                       
[43] "...43"                        "...44"                       
[45] "...45"                        "...46"                       
[47] "...47"                        "...48"                       
[49] "...49"                        "...50"                       
[51] "...51"                        "...52"                       
[53] "...53"                        "...54"                       
[55] "...55"                        "...56"                       
[57] "...57"                        "...58"                       
[59] "...59"                        "...60"                       
[61] "...61"                        "...62"                       
[63] "...63"                        "...64"                       
 [1] "Country Name"   "Country Code"   "Indicator Name" "Indicator Code"
 [5] "1960"           "1961"           "1962"           "1963"          
 [9] "1964"           "1965"           "1966"           "1967"          
[13] "1968"           "1969"           "1970"           "1971"          
[17] "1972"           "1973"           "1974"           "1975"          
[21] "1976"           "1977"           "1978"           "1979"          
[25] "1980"           "1981"           "1982"           "1983"          
[29] "1984"           "1985"           "1986"           "1987"          
[33] "1988"           "1989"           "1990"           "1991"          
[37] "1992"           "1993"           "1994"           "1995"          
[41] "1996"           "1997"           "1998"           "1999"          
[45] "2000"           "2001"           "2002"           "2003"          
[49] "2004"           "2005"           "2006"           "2007"          
[53] "2008"           "2009"           "2010"           "2011"          
[57] "2012"           "2013"           "2014"           "2015"          
[61] "2016"           "2017"           "2018"           "2019"          

Rows: 264
Columns: 64
$ `Country Name`   <chr> "Aruba", "Afghanistan", "Angola", "Albania", "Andorr…
$ `Country Code`   <chr> "ABW", "AFG", "AGO", "ALB", "AND", "ARB", "ARE", "AR…
$ `Indicator Name` <chr> "Death rate, crude (per 1,000 people)", "Death rate,…
$ `Indicator Code` <chr> "SP.DYN.CDRT.IN", "SP.DYN.CDRT.IN", "SP.DYN.CDRT.IN"…
$ `1960`           <chr> "6.3879999999999999", "32.219000000000001", "27.0970…
$ `1961`           <chr> "6.2409999999999997", "31.649000000000001", "26.8590…
$ `1962`           <chr> "6.1180000000000003", "31.093", "26.626999999999999"…
$ `1963`           <chr> "6.0119999999999996", "30.550999999999998", "26.407"…
$ `1964`           <chr> "5.9199999999999999", "30.021999999999998", "26.1939…
$ `1965`           <chr> "5.8390000000000004", "29.501000000000001", "25.9660…
$ `1966`           <chr> "5.7699999999999996", "28.984999999999999", "25.6900…
$ `1967`           <chr> "5.7160000000000002", "28.468", "25.341999999999999"…
$ `1968`           <chr> "5.6820000000000004", "27.946000000000002", "24.916"…
$ `1969`           <chr> "5.6660000000000004", "27.417999999999999", "24.4179…
$ `1970`           <chr> "5.6710000000000003", "26.879999999999999", "23.872"…
$ `1971`           <chr> "5.6980000000000004", "26.334", "23.312000000000001"…
$ `1972`           <chr> "5.7460000000000004", "25.780999999999999", "22.7770…
$ `1973`           <chr> "5.8120000000000003", "25.222000000000001", "22.2959…
$ `1974`           <chr> "5.8929999999999998", "24.658000000000001", "21.8850…
$ `1975`           <chr> "5.9809999999999999", "24.087", "21.547999999999998"…
$ `1976`           <chr> "6.0700000000000003", "23.507999999999999", "21.276"…
$ `1977`           <chr> "6.157", "22.920000000000002", "21.047000000000001",…
$ `1978`           <chr> "6.2359999999999998", "22.324000000000002", "20.8389…
$ `1979`           <chr> "6.3079999999999998", "21.719999999999999", "20.6469…
$ `1980`           <chr> "6.3760000000000003", "21.109000000000002", "20.4669…
$ `1981`           <chr> "6.444", "20.489999999999998", "20.297999999999998",…
$ `1982`           <chr> "6.5190000000000001", "19.864999999999998", "20.145"…
$ `1983`           <chr> "6.6020000000000003", "19.239999999999998", "20.009"…
$ `1984`           <chr> "6.6929999999999996", "18.617999999999999", "19.8889…
$ `1985`           <chr> "6.7850000000000001", "18.004999999999999", "19.7890…
$ `1986`           <chr> "6.8730000000000002", "17.405999999999999", "19.7100…
$ `1987`           <chr> "6.9480000000000004", "16.826000000000001", "19.651"…
$ `1988`           <chr> "7.0049999999999999", "16.268000000000001", "19.6099…
$ `1989`           <chr> "7.0430000000000001", "15.738", "19.579000000000001"…
$ `1990`           <chr> "7.0590000000000002", "15.241", "19.555", "5.9850000…
$ `1991`           <chr> "7.0540000000000003", "14.782999999999999", "19.5330…
$ `1992`           <chr> "7.0339999999999998", "14.362", "19.506", "6.1550000…
$ `1993`           <chr> "7.0049999999999999", "13.974", "19.463999999999999"…
$ `1994`           <chr> "6.9729999999999999", "13.616", "19.396000000000001"…
$ `1995`           <chr> "6.9429999999999996", "13.282", "19.292000000000002"…
$ `1996`           <chr> "6.9219999999999997", "12.964", "19.146000000000001"…
$ `1997`           <chr> "6.9109999999999996", "12.654999999999999", "18.9520…
$ `1998`           <chr> "6.915", "12.348000000000001", "18.706", "6.06700000…
$ `1999`           <chr> "6.9340000000000002", "12.037000000000001", "18.404"…
$ `2000`           <chr> "6.9710000000000001", "11.718", "18.036000000000001"…
$ `2001`           <chr> "7.0220000000000002", "11.387", "17.597000000000001"…
$ `2002`           <chr> "7.0839999999999996", "11.048", "17.09", "5.891", NA…
$ `2003`           <chr> "7.1539999999999999", "10.704000000000001", "16.5219…
$ `2004`           <chr> "7.2329999999999997", "10.356", "15.903", "6.0609999…
$ `2005`           <chr> "7.3200000000000003", "10.003", "15.24", "6.20600000…
$ `2006`           <chr> "7.4180000000000001", "9.6449999999999996", "14.539"…
$ `2007`           <chr> "7.5270000000000001", "9.2870000000000008", "13.815"…
$ `2008`           <chr> "7.6479999999999997", "8.9320000000000004", "13.0850…
$ `2009`           <chr> "7.7800000000000002", "8.5839999999999996", "12.3670…
$ `2010`           <chr> "7.9180000000000001", "8.25", "11.68", "6.8410000000…
$ `2011`           <chr> "8.0609999999999999", "7.9359999999999999", "11.039"…
$ `2012`           <chr> "8.2050000000000001", "7.6449999999999996", "10.4510…
$ `2013`           <chr> "8.3469999999999995", "7.3799999999999999", "9.92099…
$ `2014`           <chr> "8.4879999999999995", "7.141", "9.4540000000000006",…
$ `2015`           <chr> "8.6270000000000007", "6.9290000000000003", "9.05199…
$ `2016`           <chr> "8.7650000000000006", "6.742", "8.7159999999999993",…
$ `2017`           <chr> "8.907", "6.5750000000000002", "8.4320000000000004",…
$ `2018`           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `2019`           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …

That is looking better! However, we also want to remove some variables like: Country Code, Indicator Name, and Indicator Code. We can do that using the select() functio of the dplyr package. We can use the minus sign - to indicate what variables we dont want to keep. Otherwise, we will perform similar modifications as we performed on the other datasets.

# A tibble: 6 x 3
  Country  Year `Deaths/1000 People`
  <chr>   <dbl>                <dbl>
1 Aruba    1960                 6.39
2 Aruba    1961                 6.24
3 Aruba    1962                 6.12
4 Aruba    1963                 6.01
5 Aruba    1964                 5.92
6 Aruba    1965                 5.84

US-specific Data

Now we will take a look at the US data about disasters and temperature.

Disasters

# A tibble: 6 x 57
   Year `Drought Count` `Drought Cost` `Drought Lower … `Drought Upper …
  <dbl>           <dbl>          <dbl>            <dbl>            <dbl>
1  1980               1           33.2             26.4             39.6
2  1981               0            0                0                0  
3  1982               0            0                0                0  
4  1983               1            7.8              5.5              9  
5  1984               0            0                0                0  
6  1985               0            0                0                0  
# … with 52 more variables: `Drought Lower 90` <dbl>, `Drought Upper 90` <dbl>,
#   `Drought Lower 95` <dbl>, `Drought Upper 95` <dbl>, `Flooding Count` <dbl>,
#   `Flooding Cost` <dbl>, `Flooding Lower 75` <dbl>, `Flooding Upper
#   75` <dbl>, `Flooding Lower 90` <dbl>, `Flooding Upper 90` <dbl>, `Flooding
#   Lower 95` <dbl>, `Flooding Upper 95` <dbl>, `Freeze Count` <dbl>, `Freeze
#   Cost` <dbl>, `Freeze Lower 75` <dbl>, `Freeze Upper 75` <dbl>, `Freeze
#   Lower 90` <dbl>, `Freeze Upper 90` <dbl>, `Freeze Lower 95` <dbl>, `Freeze
#   Upper 95` <dbl>, `Severe Storm Count` <dbl>, `Severe Storm Cost` <dbl>,
#   `Severe Storm Lower 75` <dbl>, `Severe Storm Upper 75` <dbl>, `Severe Storm
#   Lower 90` <dbl>, `Severe Storm Upper 90` <dbl>, `Severe Storm Lower
#   95` <dbl>, `Severe Storm Upper 95` <dbl>, `Tropical Cyclone Count` <dbl>,
#   `Tropical Cyclone Cost` <dbl>, `Tropical Cyclone Lower 75` <dbl>, `Tropical
#   Cyclone Upper 75` <dbl>, `Tropical Cyclone Lower 90` <dbl>, `Tropical
#   Cyclone Upper 90` <dbl>, `Tropical Cyclone Lower 95` <dbl>, `Tropical
#   Cyclone Upper 95` <dbl>, `Wildfire Count` <dbl>, `Wildfire Cost` <dbl>,
#   `Wildfire Lower 75` <dbl>, `Wildfire Upper 75` <dbl>, `Wildfire Lower
#   90` <dbl>, `Wildfire Upper 90` <dbl>, `Wildfire Lower 95` <dbl>, `Wildfire
#   Upper 95` <dbl>, `Winter Storm Count` <dbl>, `Winter Storm Cost` <dbl>,
#   `Winter Storm Lower 75` <dbl>, `Winter Storm Upper 75` <dbl>, `Winter Storm
#   Lower 90` <dbl>, `Winter Storm Upper 90` <dbl>, `Winter Storm Lower
#   95` <dbl>, `Winter Storm Upper 95` <dbl>

We are specifically interested in the Year and the variables that contain the word "Count" so we will select them using the select() and contains() functions in the dplyr package. Since we are selecting for variables with the word "Count" we need to use quotation marks around it. Selecting for the variable year does not require this as that is actually the name of one of the existing variables.

# A tibble: 6 x 8
   Year `Drought Count` `Flooding Count` `Freeze Count` `Severe Storm C…
  <dbl>           <dbl>            <dbl>          <dbl>            <dbl>
1  1980               1                1              0                0
2  1981               0                0              1                1
3  1982               0                0              0                2
4  1983               1                2              1                0
5  1984               0                0              0                2
6  1985               0                0              1                0
# … with 3 more variables: `Tropical Cyclone Count` <dbl>, `Wildfire
#   Count` <dbl>, `Winter Storm Count` <dbl>

Now we want to create a new variable that will be the sum of all the different types of disasters for each year.

We can create this ne variable using the mutate() function of dplyr and we will use the base rowSums() function to perform the calculation. We dont want to include the Year variable in our sum, so we can exclude it using the selectfunction within the rowSums() function. However, to do so we need to indicate that we are using the data that we already used as input to our mutate() and rowSums() functions. We can do so by using a ..

Rows: 40
Columns: 9
$ Year                     <dbl> 1980, 1981, 1982, 1983, 1984, 1985, 1986, 19…
$ `Drought Count`          <dbl> 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0,…
$ `Flooding Count`         <dbl> 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,…
$ `Freeze Count`           <dbl> 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,…
$ `Severe Storm Count`     <dbl> 0, 1, 2, 0, 2, 0, 1, 0, 0, 1, 1, 1, 4, 1, 1,…
$ `Tropical Cyclone Count` <dbl> 1, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0, 1, 2, 0, 1,…
$ `Wildfire Count`         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,…
$ `Winter Storm Count`     <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 2,…
$ Disasters                <dbl> 3, 2, 3, 5, 2, 5, 2, 0, 1, 5, 3, 4, 7, 5, 6,…

Great, now we are going to remove some of these variables and just keep or select using the select() function the variables we are interested in. We will keep the Flooding Count becuase as you may recall from earlier in this case study, events of extreme perciptation levels appear to be associated with global warming. We will use this as a proxy for that.

AVOCADO why is US listed in 3 variables? We are also going to add a new variable called Country to indicate that this data is from the United States. This will create a new variable where every value is United States. We will also create a new variable called Region where every value is US-specific and a new variable called Type where every value is United States.

# A tibble: 6 x 6
   Year Country       Indicator Value Region        Type       
  <dbl> <chr>         <chr>     <dbl> <chr>         <chr>      
1  1980 United States Disasters     3 United States US-specific
2  1981 United States Disasters     2 United States US-specific
3  1982 United States Disasters     3 United States US-specific
4  1983 United States Disasters     5 United States US-specific
5  1984 United States Disasters     2 United States US-specific
6  1985 United States Disasters     5 United States US-specific

Temperature

# A tibble: 6 x 3
    Date Value Anomaly
   <dbl> <dbl>   <dbl>
1 189512  50.3   -1.68
2 189612  52.0   -0.03
3 189712  51.6   -0.46
4 189812  51.4   -0.59
5 189912  51.0   -1.01
6 190012  52.8    0.75

OK, so we want to remove the Anomaly variable which is an indicator of how different the national average temperature for that year was from the average temperature from 1901-2000 which was 52.02°F.

We also want to change the date values, which are currently listed as the year followed by the number 12. To do so we want to just keep the first 4 characters in the Date variable string values. We can use the str_sub() function of the stringr package to do this. We just need to indicate the start and stop characters. In this case the start would be 1 and the 4th character would be where we want to stop, so we would use start = 1, stop = 4. Again we will create a Country, Region and Type variable. We will also change the name of the Date variable to Year so that it will be consistent with our other datasets. Furthermore, we also what it to be numeric. We can accomplish both renaming and changing to numeric by using the mutate() function. We canthen remove the Date variable and also order the columns just like the other us data using the select() function.

# A tibble: 6 x 6
   Year Country       Indicator                Value Region        Type       
  <dbl> <chr>         <chr>                    <dbl> <chr>         <chr>      
1  1895 United States Temperature (Fahrenheit)  50.3 United States US-specific
2  1896 United States Temperature (Fahrenheit)  52.0 United States US-specific
3  1897 United States Temperature (Fahrenheit)  51.6 United States US-specific
4  1898 United States Temperature (Fahrenheit)  51.4 United States US-specific
5  1899 United States Temperature (Fahrenheit)  51.0 United States US-specific
6  1900 United States Temperature (Fahrenheit)  52.8 United States US-specific

Joining data

Now we would like to join the different datasets together into one tibble. To do so it is often necessary to have at least one column or variable with the same name to be used as a key for putting your data together. To put all of our data together there are several *_join() functions available in the dplyr package.

We will use the full_join() function as we have different time spans for each dataset and we would like to retain as much data as possible. Thefull_join() function will simply create NA values for any of the years that are not in one of the data sets. We can check by using the base summary() function. This will also allow us to check that there are column names that are consistent in each dataset that we wish to combine.

   Country               Year        Emissions       
 Length:50688       Min.   :1751   Min.   :    0.00  
 Class :character   1st Qu.:1817   1st Qu.:    0.55  
 Mode  :character   Median :1882   Median :    4.39  
                    Mean   :1882   Mean   :   83.81  
                    3rd Qu.:1948   3rd Qu.:   31.92  
                    Max.   :2014   Max.   :10300.00  
                                   NA's   :33772     
   Country               Year      GDP Growth/Capita (%)
 Length:42486       Min.   :1801   Min.   :-67.500      
 Class :character   1st Qu.:1855   1st Qu.:  0.133      
 Mode  :character   Median :1910   Median :  0.633      
                    Mean   :1910   Mean   :  1.302      
                    3rd Qu.:1965   3rd Qu.:  2.160      
                    Max.   :2019   Max.   :145.000      
                                   NA's   :2392         
   Country               Year      Energy Use (kg, oil-eq./capita)
 Length:9464        Min.   :1960   Min.   :    9.58               
 Class :character   1st Qu.:1974   1st Qu.:  505.75               
 Mode  :character   Median :1988   Median : 1185.00               
                    Mean   :1988   Mean   : 2238.82               
                    3rd Qu.:2001   3rd Qu.: 3030.00               
                    Max.   :2015   Max.   :22000.00               
                                   NA's   :3544                   
   Country               Year      Deaths/1000 People
 Length:15840       Min.   :1960   Min.   : 1.127    
 Class :character   1st Qu.:1975   1st Qu.: 7.083    
 Mode  :character   Median :1990   Median : 9.375    
                    Mean   :1990   Mean   :10.673    
                    3rd Qu.:2004   3rd Qu.:12.722    
                    Max.   :2019   Max.   :54.444    
                                   NA's   :1603      

Indeed, Country, and Year variables are present in all of the datasets. We can see that the minimum and maximum year is different for nearly all the datasets.

We need to specify what columns/variables we will be joining by using the by = argument in the full_join() function.

# A tibble: 6 x 6
  Country   Year Emissions `GDP Growth/Capi… `Energy Use (kg, … `Deaths/1000 Pe…
  <chr>    <dbl>     <dbl>             <dbl>              <dbl>            <dbl>
1 Afghani…  1751        NA                NA                 NA               NA
2 Afghani…  1752        NA                NA                 NA               NA
3 Afghani…  1753        NA                NA                 NA               NA
4 Afghani…  1754        NA                NA                 NA               NA
5 Afghani…  1755        NA                NA                 NA               NA
6 Afghani…  1756        NA                NA                 NA               NA

We can also do the same thing using by using thereduce() function of the purrr package. This is a good option if you have many dasasets to combine.

# A tibble: 6 x 6
  Country   Year Emissions `GDP Growth/Capi… `Energy Use (kg, … `Deaths/1000 Pe…
  <chr>    <dbl>     <dbl>             <dbl>              <dbl>            <dbl>
1 Afghani…  1751        NA                NA                 NA               NA
2 Afghani…  1752        NA                NA                 NA               NA
3 Afghani…  1753        NA                NA                 NA               NA
4 Afghani…  1754        NA                NA                 NA               NA
5 Afghani…  1755        NA                NA                 NA               NA
6 Afghani…  1756        NA                NA                 NA               NA
Rows: 57,246
Columns: 6
$ Country                           <chr> "Afghanistan", "Afghanistan", "Afgh…
$ Year                              <dbl> 1751, 1752, 1753, 1754, 1755, 1756,…
$ Emissions                         <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ `GDP Growth/Capita (%)`           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ `Energy Use (kg, oil-eq./capita)` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ `Deaths/1000 People`              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA,…

Nice, looks good!

We will also make a long version of this data, where we will create an new variable called Indicator that will indicate what dataset the data came from and we will collapse the values from the columns called Emissions, (CO2 Emissions (Mg)), GDP Growth/Capita (%), Energy Use (kg, oil-eq./capita), and Deaths/1000 People.

# A tibble: 6 x 4
  Country      Year Indicator                       Value
  <chr>       <dbl> <chr>                           <dbl>
1 Afghanistan  1751 Emissions                          NA
2 Afghanistan  1751 GDP Growth/Capita (%)              NA
3 Afghanistan  1751 Energy Use (kg, oil-eq./capita)    NA
4 Afghanistan  1751 Deaths/1000 People                 NA
5 Afghanistan  1752 Emissions                          NA
6 Afghanistan  1752 GDP Growth/Capita (%)              NA

We will also create a new variable called Region that will indicate if the data is about the United States or a different country based on the values in the Country variable. We will use the case_when() function of the dplyr package to do this. If the Country variable is equal to "United States" the value for the new variable will also be “United States”, where as if the Country variable is not equal to "United States" but is some other character string value, such as "Afghanistan", then the value for the new variable will be "Rest of the World". The new values for the new variable Region are indicated after the specific conditional statements by using the ~ symbol. We will also create a new variable called Type, where all the values are "Global" to indicate that this data is not specific to just the United States.

# A tibble: 6 x 6
  Country      Year Indicator                      Value Region            Type 
  <chr>       <dbl> <chr>                          <dbl> <chr>             <chr>
1 Afghanistan  1751 Emissions                         NA Rest of the World Glob…
2 Afghanistan  1751 GDP Growth/Capita (%)             NA Rest of the World Glob…
3 Afghanistan  1751 Energy Use (kg, oil-eq./capit…    NA Rest of the World Glob…
4 Afghanistan  1751 Deaths/1000 People                NA Rest of the World Glob…
5 Afghanistan  1752 Emissions                         NA Rest of the World Glob…
6 Afghanistan  1752 GDP Growth/Capita (%)             NA Rest of the World Glob…

We will now combine this data with the US data about disasters and temperatures.

We will now use the bind_rows() function which will just append the us_temperature data and the us_disaster data after the df_long data.

# A tibble: 6 x 6
   Year Country       Indicator Value Region        Type       
  <dbl> <chr>         <chr>     <dbl> <chr>         <chr>      
1  1980 United States Disasters     3 United States US-specific
2  1981 United States Disasters     2 United States US-specific
3  1982 United States Disasters     3 United States US-specific
4  1983 United States Disasters     5 United States US-specific
5  1984 United States Disasters     2 United States US-specific
6  1985 United States Disasters     5 United States US-specific
# A tibble: 6 x 6
   Year Country       Indicator                Value Region        Type       
  <dbl> <chr>         <chr>                    <dbl> <chr>         <chr>      
1  1895 United States Temperature (Fahrenheit)  50.3 United States US-specific
2  1896 United States Temperature (Fahrenheit)  52.0 United States US-specific
3  1897 United States Temperature (Fahrenheit)  51.6 United States US-specific
4  1898 United States Temperature (Fahrenheit)  51.4 United States US-specific
5  1899 United States Temperature (Fahrenheit)  51.0 United States US-specific
6  1900 United States Temperature (Fahrenheit)  52.8 United States US-specific

We can check the top and bottom of the new df_long tibble to see that our us_temperature data is at the bottom.

# A tibble: 6 x 6
  Country      Year Indicator                      Value Region            Type 
  <fct>       <dbl> <chr>                          <dbl> <chr>             <chr>
1 Afghanistan  1751 Emissions                         NA Rest of the World Glob…
2 Afghanistan  1751 GDP Growth/Capita (%)             NA Rest of the World Glob…
3 Afghanistan  1751 Energy Use (kg, oil-eq./capit…    NA Rest of the World Glob…
4 Afghanistan  1751 Deaths/1000 People                NA Rest of the World Glob…
5 Afghanistan  1752 Emissions                         NA Rest of the World Glob…
6 Afghanistan  1752 GDP Growth/Capita (%)             NA Rest of the World Glob…
# A tibble: 6 x 6
  Country        Year Indicator                Value Region        Type       
  <fct>         <dbl> <chr>                    <dbl> <chr>         <chr>      
1 United States  2014 Temperature (Fahrenheit)  52.5 United States US-specific
2 United States  2015 Temperature (Fahrenheit)  54.4 United States US-specific
3 United States  2016 Temperature (Fahrenheit)  54.9 United States US-specific
4 United States  2017 Temperature (Fahrenheit)  54.6 United States US-specific
5 United States  2018 Temperature (Fahrenheit)  53.5 United States US-specific
6 United States  2019 Temperature (Fahrenheit)  52.7 United States US-specific

Click here for details about the difference between full_join() and bind_rows()

The difference between this function and the full_join() function is that the bind_rows() function will assentially just append each dataset to each other, whereas the full_join() function collapses data that is comparable. Here you will see an example of what the data would have been like for df_wide if we had made it using bind_rows().

[1] 57246     6
[1] 118478      6
# A tibble: 1 x 6
  Country  Year Emissions `GDP Growth/Capi… `Energy Use (kg, o… `Deaths/1000 Pe…
  <chr>   <dbl>     <dbl>             <dbl>               <dbl>            <dbl>
1 China    1960       781             -6.45                  NA             25.4
# A tibble: 4 x 6
  Country  Year Emissions `GDP Growth/Capi… `Energy Use (kg, o… `Deaths/1000 Pe…
  <chr>   <dbl>     <dbl>             <dbl>               <dbl>            <dbl>
1 China    1960       781             NA                     NA             NA  
2 China    1960        NA             -6.45                  NA             NA  
3 China    1960        NA             NA                     NA             NA  
4 China    1960        NA             NA                     NA             25.4

AVOCADO Hmmm the top plot changes completely if we drop countries with na values…

# A tibble: 6 x 6
  Country      Year Indicator                      Value Region            Type 
  <fct>       <dbl> <chr>                          <dbl> <chr>             <chr>
1 Afghanistan  1751 Emissions                         NA Rest of the World Glob…
2 Afghanistan  1751 GDP Growth/Capita (%)             NA Rest of the World Glob…
3 Afghanistan  1751 Energy Use (kg, oil-eq./capit…    NA Rest of the World Glob…
4 Afghanistan  1751 Deaths/1000 People                NA Rest of the World Glob…
5 Afghanistan  1752 Emissions                         NA Rest of the World Glob…
6 Afghanistan  1752 GDP Growth/Capita (%)             NA Rest of the World Glob…
# A tibble: 6 x 6
  Country      Year Indicator             Value Region            Type  
  <fct>       <dbl> <chr>                 <dbl> <chr>             <chr> 
1 Afghanistan  1821 GDP Growth/Capita (%) 0.325 Rest of the World Global
2 Afghanistan  1822 GDP Growth/Capita (%) 0.325 Rest of the World Global
3 Afghanistan  1823 GDP Growth/Capita (%) 0.325 Rest of the World Global
4 Afghanistan  1824 GDP Growth/Capita (%) 0.325 Rest of the World Global
5 Afghanistan  1825 GDP Growth/Capita (%) 0.325 Rest of the World Global
6 Afghanistan  1826 GDP Growth/Capita (%) 0.325 Rest of the World Global

Data Exploration


Now we will create some simple plots to examine the data.

CO2 Emissions (1751-2014)

We can check the time span of this data by refering back to the What are the data? section.

Energy Use per Person (1960 to 2015)

Time spans of data

To color our plot we will use the viridis color pallette which is compatible with color-blindness by using the scale_fill_viridis_c() function which is simply available by loading the ggplot2 package.There are a few variations such as discreet as _d, or binned continuous as _b. The _c indicates a continuous scale. See here for more information.

Interestingly, we can see that Germany had ver low imission rates at the end of World War II. We see that the US has consistently had high emission rates since 1900, but that the emission rates in China recently surpased that of the US.

## US-specific

LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBDTzIgRW1pc3Npb25zIE92ZXIgVGltZSIKYXV0aG9yOiAiTWljaGFlbCBPbnRpdmVyb3MsIENhcnJpZSBXcmlnaHQsIFBoRC4iCmNzczogc3R5bGUuY3NzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgc2VsZl9jb250YWluZWQ6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKPHN0eWxlPgojVE9DIHsKICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9pbWcvbG9nby5qcGciKTsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CiAgcGFkZGluZy10b3A6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQo8L3N0eWxlPgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICc5MCUnKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoa25pdHIpCmBgYAoKIyMjIyB7Lm91dGxpbmUgfQpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIm1haW5wbG90LnBuZyIpKQpgYGAKCiMjIyMKCiMjIHsuZGlzY2xhaW1lcl9ibG9ja30KCioqRGlzY2xhaW1lcioqOiBUaGUgcHVycG9zZSBvZiB0aGUgW09wZW4gQ2FzZSBTdHVkaWVzXShodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8pe3RhcmdldD0iX2JsYW5rIn0gcHJvamVjdCBpcyAqKnRvIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdmFyaW91cyBkYXRhIHNjaWVuY2UgbWV0aG9kcywgdG9vbHMsIGFuZCBzb2Z0d2FyZSBpbiB0aGUgY29udGV4dCBvZiBtZXNzeSwgcmVhbC13b3JsZCBkYXRhKiouIEEgZ2l2ZW4gY2FzZSBzdHVkeSBkb2VzIG5vdCBjb3ZlciBhbGwgYXNwZWN0cyBvZiB0aGUgcmVzZWFyY2ggcHJvY2VzcywgaXMgbm90IGNsYWltaW5nIHRvIGJlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdheSB0byBhbmFseXplIGEgZ2l2ZW4gZGF0YSBzZXQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgbWFraW5nIHBvbGljeSBkZWNpc2lvbnMgd2l0aG91dCBleHRlcm5hbCBjb25zdWx0YXRpb24gZnJvbSBzY2llbnRpZmljIGV4cGVydHMuIAoKIyMgKipNb3RpdmF0aW9uKioKKioqIAoKVGhpcyBjYXNlIHN0dWR5IGV4cGxvcmVzIGhvdyBkaWZmZXJlbnQgY291bnRyaWVzIGhhdmUgY29udHJpYnV0ZWQgdG8gQ2FyYm9uIERpb3hpZGUgKENPMikgZW1pc3Npb25zIG92ZXIgdGltZSBhbmQgaG93IENPMiBlbWlzc2lvbiByYXRlcyBtYXkgcmVsYXRlIHRvIGluY3JlYXNpbmcgZ2xvYmFsIHRlbXBlcmF0dXJlcyBhbmQgaW5jcmVhc2VkIHJhdGVzIG9mIG5hdHVyYWwgZGlzYXN0ZXJzIGFuZCBzdG9ybXMuIFRoaXMgcmVwb3J0IHByb3ZpZGVzIGEgYmFzaXMgZm9yIHRoZSBtb3RpdmF0aW9uOiBodHRwczovL3d3dy5lcGEuZ292L3JlcG9ydC1lbnZpcm9ubWVudC9ncmVlbmhvdXNlLWdhc2VzLgoKCkNPMiBtYWtlcyB1cCB0aGUgbGFyZ2VzdCBwcm9wb3J0aW9uIG9mIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBpbiB0aGUgVW5pdGVkIFN0YXRlczoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjUwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImVtaXNzaW9ucy5qcGciKSkKYGBgCgpBIHZhcmlldHkgb2Ygc291cmNlcyBhbmQgc2VjdG9ycyBjb250cmlidXRlIHRvIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucywgd2l0aCB0cmFuc3BvcnRhdGlvbiBjb250cmlidXRpbmcgdGhlIG1vc3QgbWV0cmljIHRvbnMgb2YgQ08yOgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNjAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAic2VjdG9yLnBuZyIpKQpgYGAKClNvIHdoeSBzaG91bGQgd2UgcGF5IGF0dGVudGlvbiB0byBncmVlbmhvdXNlIGdhc2VzPwoKQWNjb3JkaW5nIHRvIHRoZSBbVVMgRW52aXJvbm1lbnRhbCBQcm90ZWN0aW9uIEFnZW5jeSAoRVBBKSBJbnZlbnRvcnkgb2YgVS5TLiBHcmVlbmhvdXNlIEdhcyBFbWlzc2lvbnMgYW5kIFNpbmtzIDIwMjAgUmVwb3J0XShodHRwczovL3d3dy5lcGEuZ292L2doZ2VtaXNzaW9ucy9pbnZlbnRvcnktdXMtZ3JlZW5ob3VzZS1nYXMtZW1pc3Npb25zLWFuZC1zaW5rcyk6IAoKPiBHcmVlbmhvdXNlIGdhc2VzIGFic29yYiBpbmZyYXJlZCByYWRpYXRpb24sIHRoZXJlYnkgdHJhcHBpbmcgaGVhdCBpbiB0aGUgYXRtb3NwaGVyZSBhbmQgbWFraW5nIHRoZSBwbGFuZXQgd2FybWVyLiBUaGUgbW9zdCBpbXBvcnRhbnQgZ3JlZW5ob3VzZSBnYXNlcyBkaXJlY3RseSBlbWl0dGVkIGJ5IGh1bWFucyBpbmNsdWRlIGNhcmJvbiBkaW94aWRlIChDTzIpLCBtZXRoYW5lIChDSDQpLCBuaXRyb3VzIG94aWRlIChOMk8pLCBhbmQgc2V2ZXJhbCBmbHVvcmluZS1jb250YWluaW5nIGhhbG9nZW5hdGVkIHN1YnN0YW5jZXMuIEFsdGhvdWdoIENPMiwgQ0g0LCBhbmQgTjJPIG9jY3VyIG5hdHVyYWxseSBpbiB0aGUgYXRtb3NwaGVyZSwgaHVtYW4gYWN0aXZpdGllcyBoYXZlIGNoYW5nZWQgdGhlaXIgYXRtb3NwaGVyaWMgY29uY2VudHJhdGlvbnMuIEZyb20gdGhlIHByZS0gaW5kdXN0cmlhbCBlcmEgKGkuZS4sIGVuZGluZyBhYm91dCAxNzUwKSB0byAyMDE4LCBjb25jZW50cmF0aW9ucyBvZiB0aGVzZSBncmVlbmhvdXNlIGdhc2VzIGhhdmUgaW5jcmVhc2VkIGdsb2JhbGx5IGJ5IDQ2LCAxNjUsIGFuZCAyMyBwZXJjZW50LCByZXNwZWN0aXZlbHkgKElQQ0MgMjAxMzsgTk9BQS9FU1JMIDIwMTlhLCAyMDE5YiwgMjAxOWMpLiAKCiogSVBDQyBzdGFuZHMgZm9yIHRoZSBJbnRlcmdvdmVybm1lbnRhbCBQYW5lbCBvbiBDbGltYXRlIENoYW5nZQoKVGhlcmUgYXJlIG1hbnkgc2lnbnMgdGhhdCBvdXIgcGxhbmV0IGlzIGV4cGVyaWVuY2luZyB3YXJtZXIgdGVtcGVyYXR1cmVzOgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI2MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJ3YXJtaW5nLnBuZyIpKQpgYGAKClRoZSBjb25uZWN0aW9uIGJldHdlZW4gZ3JlZW5ob3VzZSBnYXMgbGV2ZWxzIGFuZCBnbG9iYWwgdGVtcGVyYXR1cmVzIGFuZCB0aGUgaW5mbHVlbmNlIG9mIGluY3JlYXNlZCBnbG9iYWwgdGVtcGVyYXR1cmVzIG9uIGh1bWFuIGhlYWx0aCBhcmUgbW90aXZhdGVkIGJ5IHRoZXNlIHJlcG9ydHM6CgojIyMjIHsucmVmZXJlbmNlX2Jsb2NrfQoKTWVsaWxsbywgSi5NLiwgVC5DLiBSaWNobW9uZCwgYW5kIEcuVy4gWW9oZSAoZWRzLikuIDIwMTQuIENsaW1hdGUgY2hhbmdlIGltcGFjdHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXM6IFRoZSB0aGlyZCBOYXRpb25hbCBDbGltYXRlIEFzc2Vzc21lbnQuIFUuUy4gR2xvYmFsIENoYW5nZSBSZXNlYXJjaCBQcm9ncmFtLiAgCgoyMDIwLiDigJxJbnZlbnRvcnkgb2YgVVMgR3JlZW5ob3VzZSBHYXMgRW1pc3Npb25zIGFuZCBTaW5rczogMTk5MC0tMjAxOC7igJ0gRVBBIDQzMC1SLTIwLTAwMiwgVGVjaC4gUmVwLiBodHRwczovL3d3dy5lcGEuZ292L2doZ2VtaXNzaW9ucy9pbnZlbnRvcnktdXMtZ3JlZW5ob3VzZS1nYXMtZW1pc3Npb25zLWFuZC1zaW5rcy4KCgojIyMjCgpUaGUgTmF0aW9uYWwgQ2xpbWF0ZSBBc3Nlc3NtZW50IFJlcG9ydCBzdGF0ZXMgdGhhdDoKCj4gSGVhdC10cmFwcGluZyBnYXNlcyBhbHJlYWR5IGluIHRoZSBhdG1vc3BoZXJlIGhhdmUgY29tbWl0dGVkIHVzIHRvIGEgaG90dGVyIGZ1dHVyZSB3aXRoIG1vcmUgY2xpbWF0ZS1yZWxhdGVkIGltcGFjdHMgb3ZlciB0aGUgbmV4dCBmZXcgZGVjYWRlcy4gVGhlIG1hZ25pdHVkZSBvZiBjbGltYXRlIGNoYW5nZSBiZXlvbmQgdGhlIG5leHQgZmV3IGRlY2FkZXMgZGVwZW5kcyBwcmltYXJpbHkgb24gdGhlIGFtb3VudCBvZiBoZWF0LXRyYXBwaW5nIGdhc2VzIHRoYXQgaHVtYW4gYWN0aXZpdGllcyBlbWl0IGdsb2JhbGx5LCBub3cgYW5kIGluIHRoZSBmdXR1cmUuCgpTZWUgW2hlcmVdKGh0dHBzOi8vd3d3LmVwYS5nb3YvcmVwb3J0LWVudmlyb25tZW50L2dyZWVuaG91c2UtZ2FzZXMpIGFuZCBbaGVyZV0oaHR0cHM6Ly93b3JsZDEwMS5jZnIub3JnL2dsb2JhbC1lcmEtaXNzdWVzL2NsaW1hdGUtY2hhbmdlL2NsaW1hdGUtY2hhbmdlLWFkYXB0YXRpb25zKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiMjICoqTWFpbiBRdWVzdGlvbnMqKgoqKiogCgojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30KPGI+PHU+IE91ciBtYWluIHF1ZXN0aW9uOiA8L3U+PC9iPgoKMSkgSG93IGhhdmUgZ2xvYmFsIENPMiBlbWlzc2lvbiByYXRlcyBjaGFuZ2VkIG92ZXIgdGltZT8gSW4gcGFydGljdWxhciBmb3IgdGhlIFVTLCBhbmQgaG93IGRvZXMgdGhlIFVTIGNvbXBhcmUgdG8gb3RoZXIgY291bnRyaWVzPyAKMikgQXJlIFVTIENPMiBlbWlzc2lvbnMsIGdsb2JhbCB0ZW1wZXJhdHVyZXMsIGFuZCBVUyBzdG9ybSByYXRlcyBhc3NvY2lhdGVkPyAKCiMjIyMKCiMjICoqTGVhcm5pbmcgT2JqZWN0aXZlcyoqIAoqKiogCgpJbiB0aGlzIGNhc2Ugc3R1ZHksIHdlIHdpbGwgZXhwbG9yZSBDTzIgZW1pc3Npb24gZGF0YSBmcm9tIGFyb3VuZCB0aGUgd29ybGQuIFdlIHdpbGwgYWxzbyBmb2N1cyBvbiB0aGUgVVMgc3BlY2lmaWNhbGx5IHRvIGV2YWx1YXRlIHBhdHRlcm5zIG9mIHRlbXBlcmF0dXJlcyBhbmQgc3Rvcm0gYWN0aXZpdHkuIFRoaXMgY2FzZSBzdHVkeSB3aWxsIHBhcnRpY3VsYXJseSBmb2N1cyBvbiBob3cgdG8gdXNlIGRpZmZlcmVudCBkYXRhc2V0cyB0aGF0IHNwYW4gZGlmZmVyZW50IHJhbmdlcyBvZiB0aW1lLCBhcyB3ZWxsIGFzIGhvdyB0byBjcmVhdGUgdmlzdWFsaXphdGlvbnMgb2YgcGF0dGVybnMgb3ZlciB0aW1lLiBXZSB3aWxsIGVzcGVjaWFsbHkgZm9jdXMgb24gdXNpbmcgcGFja2FnZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIHRoZSBbYFRpZHl2ZXJzZWBdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9LCBzdWNoIGFzIGBkcGx5cmAsIGB0aWR5cmAsIGBwbG90bHlgYW5kIGBnZ2FuaW1hdGVgLiBUaGUgdGlkeXZlcnNlIGlzIGEgbGlicmFyeSBvZiBwYWNrYWdlcyBjcmVhdGVkIGJ5IFJTdHVkaW8uIFdoaWxlIHNvbWUgc3R1ZGVudHMgbWF5IGJlIGZhbWlsaWFyIHdpdGggcHJldmlvdXMgUiBwcm9ncmFtbWluZyBwYWNrYWdlcywgdGhlc2UgcGFja2FnZXMgbWFrZSBkYXRhIHNjaWVuY2UgaW4gUiBlc3BlY2lhbGx5IGVmZmljaWVudC4KCgoqKiogCgoKV2Ugd2lsbCBiZWdpbiBieSBsb2FkaW5nIHRoZSBwYWNrYWdlcyB0aGF0IHdlIHdpbGwgbmVlZDoKCmBgYHtyfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmBgYAoKCiBQYWNrYWdlICAgfCBVc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0KW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2hlcmVfaGVyZSl7dGFyZ2V0PSJfYmxhbmsifSAgICAgICB8IHRvIGVhc2lseSBsb2FkIGFuZCBzYXZlIGRhdGEKW3JlYWR4bF0oaHR0cHM6Ly9yZWFkeGwudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gIHwgdG8gaW1wb3J0IHRoZSBleGNlbCBmaWxlIGRhdGEKW3JlYWRyXShodHRwczovL3JlYWRyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IHRvIGltcG9ydCB0aGUgY3N2IGZpbGUgZGF0YQpbZHBseXJdKGh0dHBzOi8vZHBseXIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gIHwgIHRvIHZpZXcgYW5kIHdyYW5nbGUgdGhlIGRhdGEKW21hZ3JpdHRyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbWFncml0dHIvdmlnbmV0dGVzL21hZ3JpdHRyLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gIHwgIHRvIHVzZSBhbmQgcmVhc3NpZ24gZGF0YSBvYmplY3RzIHVzaW5nIHRoZSBgJTw+JWBwaXBlIG9wZXJhdG9yClt0aWR5dmVyc2VdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvcGFja2FnZXMvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IHRvIHdyYW5nbGUgdGhlIGRhdGEgYW5kIGNyZWF0ZSBnZ3Bsb3QyIHBsb3RzCltwbG90eWx5XShodHRwczovL3Bsb3RseS5jb20vci8pe3RhcmdldD0iX2JsYW5rIn0gIHwgdG8gbWFrZSB0aGUgdmlzdWFsaXphdGlvbnMKW2dncGxvdDJdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSB8IHRvIG1ha2UgdmlzdWFsaXphdGlvbnMKW2dncmVwZWxdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9nZ3JlcGVsL3ZpZ25ldHRlcy9nZ3JlcGVsLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gfCB0byBhZGQgbGFiZWxzIHRoYXQgZG9uJ3Qgb3ZlcmxhcCB0byBwbG90cwpbZ2dhbmltYXRlXShodHRwczovL2dnYW5pbWF0ZS5jb20vKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IHRvIG1ha2UgdGhlIHBsb3RzIGludGVyYWN0aXZlCltSQ29sb3JCcmV3ZXJdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9SQ29sb3JCcmV3ZXIvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgfCB0byBoYXZlIGdyZWF0ZXIgY29udHJvbCBvdmVyIHRoZSBjb2xvciBpbiBvdXIgcGxvdHMKClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMjICoqQ29udGV4dCoqCioqKiAKCkdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBhcmUgZHVlIHRvIGJvdGggbmF0dXJhbCBwcm9jZXNzZXMgYW5kIGFudGhyb3BvZ2VuaWMgKGh1bWFuLWRlcml2ZWQpIGFjdGl2aXRpZXMuIAoKVGhlc2UgZW1pc3Npb25zIGFyZSBvbmUgb2YgdGhlIGNvbnRyaWJ1dGluZyBmYWN0b3JzIHRvIHJpc2luZyBnbG9iYWwgdGVtcGVyYXR1cmVzLCB3aGljaCBjYW4gaGF2ZSBhIGdyZWF0IGluZmx1ZW5jZSBvbiBbcHVibGljIGhlYWx0aF0oaHR0cHM6Ly93d3cuZXBhLmdvdi9jbGltYXRlLWluZGljYXRvcnMvdW5kZXJzdGFuZGluZy1jb25uZWN0aW9ucy1iZXR3ZWVuLWNsaW1hdGUtY2hhbmdlLWFuZC1odW1hbi1oZWFsdGgpe3RhcmdldD0iX2JsYW5rIn0gIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgaW1hZ2U6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjgwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImhlYWx0aC5wbmciKSkKYGBgCgo+IEdhc2VzIGluIHRoZSBhdG1vc3BoZXJlIGNhbiBjb250cmlidXRlIHRvIGNsaW1hdGUgY2hhbmdlIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkuIERpcmVjdCBlZmZlY3RzIG9jY3VyIHdoZW4gdGhlIGdhcyBpdHNlbGYgYWJzb3JicyByYWRpYXRpb24uIEluZGlyZWN0IHJhZGlhdGl2ZSBmb3JjaW5nIG9jY3VycyB3aGVuIGNoZW1pY2FsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgc3Vic3RhbmNlIHByb2R1Y2Ugb3RoZXIgZ3JlZW5ob3VzZSBnYXNlcywgd2hlbiBhIGdhcyBpbmZsdWVuY2VzIHRoZSBhdG1vc3BoZXJpYyBsaWZldGltZXMgb2Ygb3RoZXIgZ2FzZXMsIGFuZC9vciB3aGVuIGEgZ2FzIGFmZmVjdHMgYXRtb3NwaGVyaWMgcHJvY2Vzc2VzIHRoYXQgYWx0ZXIgdGhlIHJhZGlhdGl2ZSBiYWxhbmNlIG9mIHRoZSBlYXJ0aCAoZS5nLiwgYWZmZWN0IGNsb3VkIGZvcm1hdGlvbiBvciBhbGJlZG8pLiBUaGUgSVBDQyBkZXZlbG9wZWQgdGhlIEdsb2JhbCBXYXJtaW5nIFBvdGVudGlhbCAoR1dQKSBjb25jZXB0IHRvIGNvbXBhcmUgdGhlIGFiaWxpdHkgb2YgYSBncmVlbmhvdXNlIGdhcyB0byB0cmFwIGhlYXQgaW4gdGhlIGF0bW9zcGhlcmUgcmVsYXRpdmUgdG8gYW5vdGhlciBnYXMuClRoZSBHV1Agb2YgYSBncmVlbmhvdXNlIGdhcyBpcyBkZWZpbmVkIGFzIHRoZSByYXRpbyBvZiB0aGUgYWNjdW11bGF0ZWQgcmFkaWF0aXZlIGZvcmNpbmcgd2l0aGluIGEgc3BlY2lmaWMgdGltZSBob3Jpem9uIGNhdXNlZCBieSBlbWl0dGluZyAxIGtpbG9ncmFtIG9mIHRoZSBnYXMsIHJlbGF0aXZlIHRvIHRoYXQgb2YgdGhlIHJlZmVyZW5jZSBnYXMgQ08yIChJUENDIDIwMTMpLiBUaGVyZWZvcmUgR1dQLXdlaWdodGVkIGVtaXNzaW9ucyBhcmUgcHJvdmlkZWQgaW4gbWlsbGlvbiBtZXRyaWMgdG9ucyBvZiBDTzIgZXF1aXZhbGVudCAoTU1UIENPMiBFcS4pCgoKIENPMiBpcyBhY3R1YWxseSB0aGUgbGVhc3QgY2FwYWJsZSBvZiB0aGUgZ3JlZW5ob3VzZSBnYXNlcyBmb3IgdHJhcHBpbmcgaGVhdDoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iODAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiR1dQLnBuZyIpKQpgYGAKCkhvd2V2ZXIsIGJlY2F1c2UgQ08yIGlzIHNvIG11Y2ggbW9yZSBhYnVuZGFudCBhbmQgc3RheXMgaW4gdGhlIGF0bW9zcGhlcmUgc28gbXVjaCBsb25nZXIgdGhhbiBvdGhlciBncmVlbmhvdXNlIGdhc2VzLCBpdCBoYXMgYmVlbiB0aGUgbGFyZ2VzdCBjb250cmlidXRvciB0byBnbG9iYWwgd2FybWluZy4KClNlZSBbaGVyZV0oaHR0cHM6Ly93d3cudWNzdXNhLm9yZy9yZXNvdXJjZXMvd2h5LWRvZXMtY28yLWdldC1tb3JlLWF0dGVudGlvbi1vdGhlci1nYXNlcyM6fjp0ZXh0PUNPMiUyMHN0aWNrcyUyMGFyb3VuZCxveGlkZSUyMChOMk8pe3RhcmdldD0iX2JsYW5rIn0uKQpmb3IgbW9yZSBkZXRhaWxzLgoKCkZ1cnRoZXJtb3JlLCBzaXppbmcgQ08yIGxldmVscyBhbHNvIGluZmx1ZW5jZSBvY2VhbiBhY2lkaXR5OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI1MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJvY2VhbnMucG5nIikpCmBgYAoKVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgZm9yIG9yZ2FuaXNtcyB0byBtYWludGFpbiB0aGVpciBzaGVsbHMgb3Igc2tlbGV0b25zIHRoYXQgYXJlIG1hZGUgb2YgY2FsY2l1bSBjYXJib25hdGUsIHRodXMgbWFraW5nIGl0IG1vcmUgZGlmZmljdWx0IGZvciB0aGVzZSBvcmdhbmlzbXMgdG8gc3Vydml2ZSBhbmQgaW1wYWN0aW5nIHRoZWlyIHJvbGUgaW4gdGhlIGVjb3N5c3RlbSBhbmQgZm9vZCBjaGFpbi4gCgoKRnVydGhlcm1vcmUsIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBhcmUgYmVsaWV2ZWQgdG8gaW5mbHVlbmNlIHN0b3JtIHJhdGVzLiAKCkluZGVlZCBldmVudHMgd2l0aCBoaWdoIGxldmVscyBvZiBwcmVjaXBpdGF0aW9uIHdoaWNoIGNhbiBpbmR1Y2UgZmxvb2RpbmcgYW5kIHByb3BlcnR5IGRhbWFnZSBhcmUgZ2VuZXJhbGx5IGluY3JlYXNpbmcgYXJvdW5kIHRoZSBjb3VudHJ5OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI1MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJzdG9ybXMucG5nIikpCmBgYAoKCiMjICoqTGltaXRhdGlvbnMqKgoqKiogCgpUaGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgcmVnYXJkaW5nIHRoaXMgZGF0YSBhbmFseXNpcyB0byBrZWVwIGluIG1pbmQ6IAoKMSkgQ29ycmVsYXRpb24gb3IgYXNzb2NpYXRpb24gZG9lcyBub3QgaW1wbHkgY2F1c2F0aW9uIAoKMikgTGltaXRhaXRvbiAyICAKCgoKCgoKIyMgKipXaGF0IGFyZSB0aGUgZGF0YT8qKgoqKiogCgpJbiB0aGlzIGNhc2Ugc3R1ZHkgd2Ugd2lsbCBiZSB1c2luZyBkYXRhIHJlbGF0ZWQgdG8gQ08yIGVtaXNzaW9ucywgYXMgd2VsbCBhcyBvdGhlciBkYXRhIHRoYXQgbWF5IGluZmx1ZW5jZSwgYmUgaW5mbHVlbmNlZCBvciByZWxhdGUgdG8gQ08yIGVtaXNzaW9ucy4gTW9zdCBvZiBvdXIgZGF0YSB3YXMgb2J0YWluZWQgZnJvbSBbR2FwbWluZGVyXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2RhdGEvKXt0YXJnZXQ9Il9ibGFuayJ9LCB3aGljaCBpcyBhIHVuaXF1ZSBub25wcm9maXQgdGhhdCBwcm92aWRlcyBhIHZhcmlldHkgb2YgZGF0YSBmb3IgZnJlZS4KCkluIHRoZWlyIHdvcmRzLCBHYXBtaW5kZXIgaXMuLi4KCj4gR2FwbWluZGVyIGlzIGFuIGluZGVwZW5kZW50IFN3ZWRpc2ggZm91bmRhdGlvbiB3aXRoIG5vIHBvbGl0aWNhbCwgcmVsaWdpb3VzIG9yIGVjb25vbWljIGFmZmlsaWF0aW9ucy4gR2FwbWluZGVyIGlzIGEgZmFjdCB0YW5rLCBub3QgYSB0aGluayB0YW5rLiBHYXBtaW5kZXIgZmlnaHRzIGRldmFzdGF0aW5nIG1pc2NvbmNlcHRpb25zIGFib3V0IGdsb2JhbCBkZXZlbG9wbWVudC4gR2FwbWluZGVyIHByb2R1Y2VzIGZyZWUgdGVhY2hpbmcgcmVzb3VyY2VzIG1ha2luZyB0aGUgd29ybGQgdW5kZXJzdGFuZGFibGUgYmFzZWQgb24gcmVsaWFibGUgc3RhdGlzdGljcy4gR2FwbWluZGVyIHByb21vdGVzIGEgZmFjdC1iYXNlZCB3b3JsZHZpZXcgZXZlcnlvbmUgY2FuIHVuZGVyc3RhbmQuICBHYXBtaW5kZXIgY29sbGFib3JhdGVzIHdpdGggdW5pdmVyc2l0aWVzLCBVTiwgcHVibGljIGFnZW5jaWVzIGFuZCBub24tZ292ZXJubWVudGFsIG9yZ2FuaXphdGlvbnMuIEFsbCBHYXBtaW5kZXIgYWN0aXZpdGllcyBhcmUgZ292ZXJuZWQgYnkgdGhlIGJvYXJkLiBXZSBkbyBub3QgYXdhcmQgZ3JhbnRzLiBHYXBtaW5kZXIgRm91bmRhdGlvbiBpcyByZWdpc3RlcmVkIGF0IFN0b2NraG9sbSBDb3VudHkgQWRtaW5pc3RyYXRpb24gQm9hcmQuIE91ciBjb25zdGl0dXRpb24gY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2Fib3V0LWdhcG1pbmRlci9jb25zdGl0dXRpb24vKS4KClRoZSBkYXRhIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBmcm9tIEdhcG1pbmRlciB3YXMgb2J0YWluZWQgZnJvbSB0aGUgW1dvcmxkIEJhbmtdKGh0dHBzOi8vd3d3LndvcmxkYmFuay5vcmcvZW4vd2hhdC13ZS1kbyl7dGFyZ2V0PSJfYmxhbmsifS4KCgpJbiBhZGRpdGlvbiB3ZSB3aWxsIHVzZSBzb21lIGRhdGEgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgVW5pdGVkIFN0YXRlcyBmcm9tIHRoZSBbTmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb24gKE5PQUEpXSAoaHR0cHM6Ly93d3cubm9hYS5nb3YvKSwgd2hpY2ggaXMgYW4gYWdlbmN5IHRoYXQgY29sbGVjdHMgd2VhdGhlciBhbmQgY2xpbWF0ZSBkYXRhLgoKCkRhdGEgICB8IFRpbWUgc3BhbiB8IFNvdXJjZSAgfCBPcmdpbmFsIFNvdXJjZSAgIHwgRGVzY3JpcHRpb24gfCBDaXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0KKipDTzIgZW1pc3Npb25zKiogIHwxNzUxIHRvIDIwMTQgfCBbR2FwbWluZGVyXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2RhdGEvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IFtDYXJib24gRGlveGlkIEluZm9ybWF0aW9uIEFuYWx5c2lzIENlbnRlciAoQ0RJQUMpXShodHRwczovL2NkaWFjLmVzcy1kaXZlLmxibC5nb3YvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8ICBDTzIgZW1pc3Npb25zIGluIHRvbm5lcyBvciBtZXRyaWMgdG9ucyAoZXF1aXZhbGVudCB0byBhcHByb3hpbWF0ZWx5IDIsMjA0LjYgcG91bmRzKSBwZXIgcGVyc29uIGJ5IGNvdW50cnl8IE5BCioqR0RQIHBlciBjYXBpdGEsIHllYXJseSBncm93dGgqKiB8IDE4MDEgdG8gMjAxOXwgW0dhcG1pbmRlcl0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCBbV29ybGQgQmFua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLktELlpHKXt0YXJnZXQ9Il9ibGFuayJ9ICB8ICBbR3Jvd3RoIERvbWVzdGljIFByb2R1Y3RdKGh0dHBzOi8vd3d3LmludmVzdG9wZWRpYS5jb20vdGVybXMvZy9nZHAuYXNwIzp+OnRleHQ9R3Jvc3MlMjBEb21lc3RpYyUyMFByb2R1Y3QlMjAoR0RQKSUyMGlzJTIwdGhlJTIwbW9uZXRhcnklMjB2YWx1ZSUyMG9mJTIwYWxsLGV4cGVuZGl0dXJlcyUyQyUyMHByb2R1Y3Rpb24lMkMlMjBvciUyMGluY29tZXMuKXt0YXJnZXQ9Il9ibGFuayJ9ICAod2hpY2ggaXMgYW4gb3ZlcmFsbCBtZWFzdXJlIG9mIHRoZSBoZWFsdGggb2YgbmF0aW9uJ3MgZWNvbm9teSkgcGVyIHBlcnNvbiBieSBjb3VudHJ5fCBOQQoqKkVuZXJneSB1c2UgcGVyIHBlcnNvbioqIHwxOTYwIHRvIDIwMTUgfCBbR2FwbWluZGVyXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2RhdGEvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IFtXb3JsZCBCYW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuVVNFLlBDQVAuS0cuT0Upe3RhcmdldD0iX2JsYW5rIn0gIHwgIFVzZSBvZiBwcmltYXJ5IGVuZXJneSBiZWZvcmUgdHJhbnNmb3JtYXRpb24gdG8gb3RoZXIgZW5kLXVzZSBmdWxlcywgYnkgY291bnRyeSB8IE5BCioqQ3J1ZGUgTW9ydGFsaXR5IFJhdGUqKiB8MTk2MCB0byAyMDE4IHwgW1dvcmxkIEJhbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0RSVC5JTil7dGFyZ2V0PSJfYmxhbmsifSAgfCBbV29ybGQgQmFua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKXt0YXJnZXQ9Il9ibGFuayJ9IHwgIERlYXRoIHJhdGUgcGVyIDEsMDAwIHBlb3BsZSBieSBjb3VudHJ5IHwgTkEgCioqVVMgTmF0dXJhbCBEaXNhc3RlcnMqKiB8IDE5ODAgdG8gMjAxOSB8IFtUaGUgTmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb24gKE5PQUEpXShodHRwczovL3d3dy5uY2RjLm5vYWEuZ292L2JpbGxpb25zL3RpbWUtc2VyaWVzKXt0YXJnZXQ9Il9ibGFuayJ9fCBbVGhlIE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9uIChOT0FBKSBdKGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvYmlsbGlvbnMvdGltZS1zZXJpZXMpe3RhcmdldD0iX2JsYW5rIn18ICBVUyBkYXRhIGFib3V0OiA8YnI+IC0tIERyb3VnaHRzIDxicj4gLS0gRmxvb2RzIDxicj4gLS0gRnJlZXplcyA8YnI+IC0tIFNldmVyZSBTdG9ybXMgPGJyPiAtLSBUcm9waWNhbCBDeWNsb25lcyA8YnI+IC0tIFdpbGRmaXJlczxicj4gLS0gV2ludGVyIFN0b3JtcyB8IE5PQUEgTmF0aW9uYWwgQ2VudGVycyBmb3IgRW52aXJvbm1lbnRhbCBJbmZvcm1hdGlvbiAoTkNFSSkgVS5TLiBCaWxsaW9uLURvbGxhciBXZWF0aGVyIGFuZCBDbGltYXRlIERpc2FzdGVycyAoMjAyMCkuIGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvYmlsbGlvbnMvLCBET0k6IDEwLjI1OTIxL3N0a3ctN3c3MwoqKlRlbXBlcmF0dXJlKiogIHwgMTg5NSB0byAyMDE5fCAgW1RoZSBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbiAoTk9BQSldKGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvY2FnL25hdGlvbmFsL3RpbWUtc2VyaWVzKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IFtUaGUgTmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb24gKE5PQUEpXShodHRwczovL3d3dy5uY2RjLm5vYWEuZ292L2NhZy9uYXRpb25hbC90aW1lLXNlcmllcyl7dGFyZ2V0PSJfYmxhbmsifSB8IFVTIE5hdGlvbmFsIHllYXJseSBhdmVyYWdlIHRlbXBlcmF0dXJlIChpbiBGYWhyZW5oZWl0KSBmcm9tIDE4OTUgdG8gMjAxOSB8IE5PQUEgTmF0aW9uYWwgQ2VudGVycyBmb3IgRW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiwgQ2xpbWF0ZSBhdCBhIEdsYW5jZTogTmF0aW9uYWwgVGltZSBTZXJpZXMsIHB1Ymxpc2hlZCBKdW5lIDIwMjAsIHJldHJpZXZlZCBvbiBKdW5lIDI2LCAyMDIwIGZyb20gaHR0cHM6Ly93d3cubmNkYy5ub2FhLmdvdi9jYWcvCgoKVG8gb2J0YWluIHRoZSB0ZW1wZXJhdHVyZSBkYXRhLCBhbm51YWwgYXZlcmFnZSB0ZW1wZXJhdHVyZXMgd2VyZSBzZWxlY3RlZCBhcyBzaG93biBpbiB0aGlzIGltYWdlOgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInRlbXAucG5nIikpCmBgYAoKCkltcG9ydGFudGx5LCBub3RpY2UgdGhhdCB0aGUgZGF0YSB3ZSB3b3VsZCBsaWtlIHRvIHVzZSBzcGFuIGRpZmZlcmVudCB0aW1lIHBlcmlvZHM6CgpEYXRhICAgfCBUaW1lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQoqKkNPMiBlbWlzc2lvbnMqKiAgfDE3NTEgdG8gMjAxNCAKKipHRFAgcGVyIGNhcGl0YSwgeWVhcmx5IGdyb3d0aCoqIHwgMTgwMSB0byAyMDE5CioqRW5lcmd5IHVzZSBwZXIgcGVyc29uKiogfDE5NjAgdG8gMjAxNSAKKipDcnVkZSBNb3J0YWxpdHkgUmF0ZSoqIHwxOTYwIHRvIDIwMTggCioqVVMgTmF0dXJhbCBEaXNhc3RlcnMqKiB8IDE5ODAgdG8gMjAxOSAKKipUZW1wZXJhdHVyZSoqICB8IDE4OTUgdG8gMjAxOQoKCgoKIyMgKipEYXRhIEltcG9ydCoqCioqKiAKClRvIHJlYWQgaW4gdGhlIGZpbGVzIHRoYXQgd2VyZSBkb3dubG9hZGVkIGZyb20gdGhlIHZhcmlvdXMgc291cmNlcyBhcyBpbmRpY2F0ZWQgaW4gdGhlIHRhYmxlIGFib3ZlLCB3ZSB3aWxsIHVzZSB0aGUgYHJlYWRfeGxzeCgpYCBhbmQgYHJlYWRfeGxzKClgIGZ1bmN0aW9ucyBvZiB0aGUgYHJlYWR4bGAgcGFja2FnZSB0byBpbXBvcnQgdGhlIGRhdGEgZnJvbSB0aGUgLnhsc3ggYW5kIC54bHMgZmlsZXMgcmVzcGVjdGl2ZWx5IGFuZCB3ZSB3aWxsIHVzZSB0aGUgYHJlYWRfY3N2YCBmdW5jdGlvbiBvZiB0aGUgYHJlYWRyYCBwYWNrYWdlIHRvIGltcG9ydCB0aGUgZGF0YSBmcm9tIHRoZSBjc3YgZmlsZXMuCgpgYGB7cn0KIyB4bHN4IGZpbGVzOgpDTzJfZW1pc3Npb25zIDwtIHJlYWR4bDo6cmVhZF94bHN4KGhlcmUoImRvY3MveWVhcmx5X2NvMl9lbWlzc2lvbnNfMTAwMF90b25uZXMueGxzeCIpKQpnZHBfZ3Jvd3RoIDwtIHJlYWR4bDo6cmVhZF94bHN4KGhlcmUoImRvY3MvZ2RwX3Blcl9jYXBpdGFfeWVhcmx5X2dyb3d0aC54bHN4IikpCmVuZXJneV91c2UgPC0gcmVhZHhsOjpyZWFkX3hsc3goaGVyZSgiZG9jcy9lbmVyZ3lfdXNlX3Blcl9wZXJzb24ueGxzeCIpKQoKIyB4bHMgZmlsZToKbW9ydGFsaXR5IDwtIHJlYWR4bDo6cmVhZF94bHMoaGVyZSgiZG9jcy9BUElfU1AuRFlOLkNEUlQuSU5fRFMyX2VuX2V4Y2VsX3YyXzgwNDM4NC54bHMiKSkKYGBgCgpGb3Igb3VyIGNzdiBkYXRhIGZpbGVzLCB0aGVyZSBhcmUgc29tZSBsaW5lcyB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gbm90IGltcG9ydCAtIGluZmFjdCwgd2Ugd2lsbCBnZXQgYW4gZXJyb3IgaWYgd2UgdHJ5IHRvIGltcG9ydCB0aGVtIGJlY2F1c2Ugb3VyIHRhYmxlIHN0cnVjdHVyZSB3aWxsIGJlIGFzIHIgZXhwZWN0cy4gV2UgY2FuIGRvIHNvIHVzaW5nIHRoZSBgc2tpcCA9YCBhcmd1bWVudCBvZiB0aGUgYHJlYWRfY3N2KClgIGZ1bmN0aW9uLiAKCkhlcmUgeW91IGNhbiBzZWUgdGhhdCB0aGUgZmlyc3QgdHdvIHJvd3Mgb2YgdGhlIGRhdGEgYWJvdXQgVVMgRGlzYXN0ZXJzIGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucyBhcyB0aGUgc3Vic2VxdWVudCByb3dzLiBTbyB3ZSB3YW50IHRvIHNraXAgdGhlc2UgZmlyc3QgdHdvIGxpbmVzLCB3ZSB3aWxsIHVzZSBgc2tpcCA9IDJgIGZvciB0aGlzLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJEaXNhc3RlcnMucG5nIikpCmBgYApOb3cgbG9va2luZyBhdCB0aGUgdGVtcGVyYXR1cmUgZGF0YSwgd2UgY2FuIHNlZSB0aGF0ICB0aGUgZmlyc3QgZm91ciBsaW5lcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucyBhcyB0aGUgc3Vic2VxdWVudCBsaW5lcy4gV2Ugd2lsbCBza2lwIGltcG9ydGluZyBhbGwgNCBsaW5lcyBieSB1c2luZyBgc2tpcCA9IDRgLiBXZSBjYW4gYWxzbyBzcGVjaWZ5IHRoYXQgYE5BYCB2YWx1ZXMgYXJlIGVuY29kZWQgYXMgYCItOTkiYC4gVGhpcyB3aWxsIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBgIi05OSJgIHdpdGggYE5BYC4gV2UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGBuYSA9IGAgYXJndW1lbnQgb2YgdGhlIGByZWFkX2NzdigpYCBmdW5jdGlvbi4gV2Ugd2lsbCBkbyBzbyBhczogYG5hID0gIi05OSJgLiBUaGUgIi05OSIgbmVlZHMgdG8gYmUgaW4gcXVvdGF0aW9uIG1hcmtlcyBiZWN1YXNlIHRoaXMgYXJndW1lbnQgZXhwZWN0cyBjaGFyYWN0ZXJzLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJ0ZW1wZGF0YS5wbmciKSkKYGBgCgpgYGB7cn0KI2NzdiBmaWxlczoKdXNfZGlzYXN0ZXIgPC0gcmVhZHI6OnJlYWRfY3N2KGhlcmUoImRvY3MvdGltZS1zZXJpZXMtVVMuY3N2IiksIHNraXAgPSAyKQp1c190ZW1wZXJhdHVyZSA8LSByZWFkcjo6cmVhZF9jc3YoaGVyZSgiZG9jcy90ZW1wZXJhdHVyZTIuY3N2IiksIHNraXAgPSA0LCBuYSA9Ii05OSIpCmBgYAoKR3JlYXQhIG5vdyB3ZSBoYXZlIGltcG9ydGVkIGFsbCBvZiB0aGUgZGF0YSB0aGF0IHdlIHdpbGwgbmVlZC4KCgojIyAqKkRhdGEgRXhwbG9yYXRpb24gYW5kIFdyYW5nbGluZyoqCioqKiAKCk5vdyB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IG91ciBkYXRhIGFuZCB3cmFuZ2xlIGl0IHVudGlsIGl0IGlzIGVhc3kgdG8gdXNlIHRvIGFsbG93IHVzIHRvIGV2YWx1YXRlIGhvdyBDTzIgZW1pc3Npb25zIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUgYW5kIGhvdyBlbWlzc2lvbnMgbWF5IHJlbGF0ZSB0byBlbmVyZ3kgdXNlLCBtb3J0YWxpdHksIEdEUCBldGMuIAoKIyMjIFllYXJseSBDT34yfiBFbWlzc2lvbnMKCkZpcnN0IGxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBDTzIgZGF0YS4gV2UgY2FuIHVzZSB0aGUgYmFzZSBgaGVhZCgpYCBmdW5jdGlvbiB0byBzZWUganVzdCB0aGUgZmlyc3QgNiByb3dzIG9mIG91ciBkYXRhLgoKV2Ugd2lsbCB1c2UgdGhlIGAlPiVgIHBpcGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBpbnB1dCBmb3IgbGF0ZXIgc2VxdWVudGlhbCBzdGVwcy4gVGhpcyB3aWxsIG1ha2UgbW9yZSBzZW5zZSB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgc2VxdWVudGlhbCBzdGVwcyB1c2luZyB0aGUgc2FtZSBkYXRhIG9iamVjdC4gVG8gdXNlIHRoZSBwaXBlIG5vdGF0aW9uIHdlIG5lZWQgdG8gaW5zdGFsbCBhbmQgbG9hZCAgdGhlIGBkcGx5cmAgcGFja2FnZS4KCmBgYHtyfQpDTzJfZW1pc3Npb25zICU+JQogIGhlYWQoKQpgYGAKCk9LLCB3ZSBjYW4gc2VlIHRoYXQgb3VyIGNvdW50cnkgZGF0YSBtYWtlcyBvZiB0aGUgcm93cyBhbmQgdGhlIHllYXJseSBkYXRhIG1ha2VzIHVwIHRoZSBjb2x1bW5zLiBXZSBhbHNvIHNlZSB0aGF0IHdlIGhhdmUgYWxvdCBvZiBgTkFgIHZhbHVlcy4KCgpXZSBjYW4gYWxzbyB1c2UgdGhlIGBnbGltcHNlKClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2tnZSB0byB2aWV3IG91ciBkYXRhLiBUaGlzIGFsbG93cyB1cyB0byBzZWUgbW9yZSBvZiBvdXIgZGF0YSBhdCBvbmNlLiBXZSB3aWxsIHNlZSBhIHRpbnkgYml0IG9mIGVhY2ggdmFyaWFibGUvY29sdW1uLiBUbyBkbyBzbyBvdXIgZGF0YSB3aWxsIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBjb2x1bW4gbmFtZXMgbGlzdGVkIG9uIHRoZSByaWdodC4KCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKQ08yX2VtaXNzaW9ucyAlPiUKZHBseXI6OmdsaW1wc2UoKQpgYGAKIyMjIwoKCiAgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgbgogIDxjaHI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPGludD4KMSBDTzIgRW1pc3Npb25zIChNZykgICAgICAgICAgICAgIDU3MjQ2CjIgRGVhdGhzLzEwMDAgUGVvcGxlICAgICAgICAgICAgICA1NzI0NgozIERpc2FzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgNDAKNCBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpIDU3MjQ2CjUgR0RQIEdyb3d0aC9DYXBpdGEgKCUpICAgICAgICAgICA1NzI0Ngo2IFRlbXBlcmF0dXJlIChGYWhyZW5oZWl0KSAgICAgICAgICAxMTYKCgpXZSBjYW4gc2VlIHRoYXQgd2UgaGF2ZSBhIGxhcmdlIFt0aWJibGVdKGh0dHBzOi8vdGliYmxlLnRpZHl2ZXJzZS5vcmcvKS4gQSB0aWJibGUgaXMgdGhlIHRpZHl2ZXJzZSB2ZXJzaW9uIG9mIGEgZGF0YSBmcmFtZS4gSXQgaXMgZXNzZW50aWFsbHkgYSB0YWJsZSB3aXRoIHZhcmlhYmxlIGluZm9ybWF0aW9uIGFycmFuZ2VkIGFzIGNvbHVtbnMsIGFuZCBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyBhcnJhbmdlZCBhcyByb3dzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIHRpYmJsZSBnaXZlcyB1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3Mgb2YgZWFjaCB2YXJpYWJsZS4gIEZvciBleGFtcGxlIHRoZSBgY291bnRyeWAgdmFyaWFibGUgaXMgbWFkZSB1cCBvZiBjaGFyYWN0ZXIgKGFiYnJldmlhdGVkIGFzIGNocikgdmFsdWVzLiBXZSBzZWUgdGhhdCB3ZSBoYXZlIDI2NSBkaWZmZXJlbnQgY291bnRyeSB2YXJpYWJsZXMgYW5kIENPMiBlbWlzc2lvbiB2YWx1ZXMgZm9yIDE5MiBkaWZmZXJlbnQgeWVhcnMgKGZyb20gMTc1MSB0byAyMDE0KS4gUmVjYWxsIHRoYXQgdGhlIHZhbHVlcyBhcmUgZW1pc3Npb25zIGluIG1ldHJpYyB0b25zIGFsc28gY2FsbGVkIHRvbm5lcy4gV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBmZXdlciBgTkFgIHZhbHVlcyBmb3IgbGF0ZXIgeWVhcnMuCgpOb3cgd2Ugd2lsbCBtb2RpZnkgdGhpcyBkYXRhIHRvIG1ha2UgaXQgbW9yZSB1c2FibGUgZm9yIG1ha2luZyB2aXN1YWxpemF0aW9ucy4gT25lIHRoaW5nIHdlIHdpbGwgdXNlIGlzIHRoZSBgJTw+JWAgb3BwZXJhdG9yIHdoaWNoIGlzIGZyb20gdGhlIGBtYWdyaXR0cmAgcGFja2FnZS4gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIG91ciBgQ08yX2VtaXNzaW9uc2AgZGF0YSBhbmQgcmVhc3NpZ24gaXQgdG8gYSBtb2RpZmllZCB2ZXJzaW9uIGF0IHRoZSBzYW1lIHRpbWUuIAoKV2Ugd2lsbCB1c2UgdGhlIGBwaXZvdF9sb25nZXIoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSB0byBjb252ZXJ0IG91ciBkYXRhIGludG8gd2hhdCBpcyBjYWxsZWQgbG9uZyBmb3JtYXQuIFRoaXMgbWVhbnMgdGhhdCB3ZSB3aWxsIGhhdmUgbW9yZSByb3dzIGFuZCBmZXdlciBjb2x1bW5zIHRoYW4gb3VyIGN1cnJlbnQgZm9ybWF0LiBUaGlzIGlzIGRvbmUgYnkgY29sbGFwc2luZyBtdWx0aXBsZSB2YXJpYWJsZXMgaW50byBmZXdlciB2YXJpYWJsZXMuCgpXZSB3YW50IHRvIGNvbGxhcHNlIGFsbCBvZiB0aGUgdmFsdWVzIGZvciB0aGUgZW1pc3Npb24gZGF0YSBhY3Jvc3MgdGhlIGRpZmZlcmVudCBpbmRpdmlkdWFsIHllYXIgdmFyaWFibGVzIGludG8gb25lIG5ldyBlbWlzc2lvbiB2YXJpYWJsZSBhbmQgd2Ugd2lsbCBpZGVudGlmeSB3aGF0IHllYXIgdGhleSBhcmUgZnJvbSB1c2luZyBhIG5ldyBgWWVhcmAgdmFyaWFibGUuCgpgYGB7cn0KQ08yX2VtaXNzaW9ucyAgJTw+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksIG5hbWVzX3RvID0gIlllYXIiLCB2YWx1ZXNfdG8gPSAiRW1pc3Npb25zIikKCmhlYWQoQ08yX2VtaXNzaW9ucykKYGBgCgpXZSBhbHNvIHdhbnQgdG8gcmVuYW1lIHRoZSBgY291bnRyeWAgdmFyaWFibGUgdG8gYmUgY2FwaXRhbGl6ZWQuIFcgV2UgY2FuIHVzZSB0aGUgYHJlbmFtZSgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlIHRvIHJlbmFtZSB0aGlzIHZhcmlhYmxlLiBXaGVuIHJlbmFtaW5nIHZhcmlhYmxlcyB0aGUgbmV3IG5hbWUgaXMgbGlzdGVkIGZpcnN0IGJlZm9yZSB0aGUgYD1gLiBXZSB3aWxsIGFsc28gbW9kaWZ5IHRoZSBgRW1pc3Npb25zYCBkYXRhIGJ5IGRpdmlkaW5nIGl0IGJ5IDEwMDAgdG8gbWFrZSB0aGUgbnVtYmVycyBzbWFsbGVyLiBUbyBkbyB0aGlzIHdlIHdpbGwgdXNlIHRoZSBgbXV0YXRlKClgIGZ1bmN0aW9uLCB3aGljaCBpcyBhbHNvIHBhcnQgb2YgdGhlIGBkcGx5cigpYCBwYWNrYWdlLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBjcmVhdGUgYW5kIG1vZGlmeSB2YXJpYWJsZXMuIFlvdSBtYXkgYWxzbyBub3RlIHRoYXQgdGhlIGBZZWFyYCB2YXJpYWJsZSBpcyBjdXJyZW50bHkgb2YgY2xhc3MgdHlwZSBjaGFyYWN0ZXIuIFdlIHdvdWxkIGxpa2UgdG8gY2hhbmdlIGl0IHRvIGJlIG51bWVyaWMuIFRoaXMgY2FuIGFsc28gYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSBgbXV0YXRlKClgIGZ1bmN0aW9uLgoKYGBge3J9CiAgCiBDTzJfZW1pc3Npb25zICAlPD4lIAogICBkcGx5cjo6cmVuYW1lKENvdW50cnk9Y291bnRyeSkgJT4lCiAgIGRwbHlyOjptdXRhdGUoRW1pc3Npb25zID0gRW1pc3Npb25zLzEwMDAsIAogICAgICAgICAgWWVhciA9IGFzLm51bWVyaWMoWWVhcikpCiAgICAgI3JlbmFtZShgQ08yIEVtaXNzaW9ucyAoTWcpYD0gRW1pc3Npb25zKQoKYGBgCgpOb3cgbGV0J3MgdGFrZSBhIGxvb2sgdG8gc2VlIGhvdyBvdXIgZGF0YSBoYXMgY2hhbmdlZDoKCmBgYHtyfQoKQ08yX2VtaXNzaW9ucyAlPiUKaGVhZCgpCgpgYGAKR3JlYXQsIHdlIGNhbiBzZWUgdGhhdCBub3cgdGhlIGBZZWFyYCB2YXJpYWJsZSBpcyBvZiBjbGFzcyBkb3VibGUgKGFiYnJldmlhdGVkIGBkYmxgKSwgd2hpY2ggaXMgYSBudW1lcmljIGNsYXNzLgoKIyMjIFllYXJseSBHcm93dGggaW4gR0RQIHBlciBDYXBpdGEKCmBgYHtyfQpnZHBfZ3Jvd3RoICU+JQogIGhlYWQoKQpgYGAKCmBgYHtyfQpuYW1lcyhnZHBfZ3Jvd3RoKQpgYGAKCiMjIyMgey5zY3JvbGxhYmxlfQpgYGB7cn0KIyBTY3JvbGwgdGhyb3VnaCB0aGUgb3V0cHV0IQpnZHBfZ3Jvd3RoICU+JQpnbGltcHNlKCkKYGBgCiMjIyMKCkFnYWluLCB3ZSB3aWxsIHVzZSB0aGUgYHBpdm90X2xvbmdlcigpYCB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgdG8gbG9uZyBmb3JtYXQuIFdlIHdpbGwgYWxzbyBhZ2FpbiBjaGFuZ2UgdGhlIGBjb3VudHJ5YCB2YXJpYWJsZSB0byBiZSBgQ291bnRyeWAgYnkgdXNpbmcgdGhlIGByZW5hbWUoKWAgZnVuY3Rpb24gLCBhbmQgd2Ugd2lsbCBtYWtlIHRoZSBgWWVhcmAgdmFyYWlibGUgbnVtZXJpYyB1c2luZyB0aGUgYG11dGF0ZSgpYCBmdW5jdGlvbi4gCgpBVk9DQURPLi4uIHRoaXMgd2FzIGluIE1pY2hhZWwncyBjb2RlLi4uIGJ1dCBJIGRvbid0IGtub3cgdGhhdCB3ZSBuZWVkIGl0CldlIHdpbGwgdXNlIHRoZSBgZHJvcF9uYSgpYCBmdW5jdGlvbiBvZiB0aGUgYHRpZHlyYCBwYWNrYWdlIHRvIGRyb3AgYWxsIHllYXJzIHdpdGggbWlzc2luZyBkYXRhLgoKYGBge3J9CiMgZ2RwX2dyb3d0aCAlPD4lCiMgICAgdGlkeXI6OmRyb3BfbmEoKQojIAojIGhlYWQoZ2RwX2dyb3d0aCkKYGBgCgpgYGB7cn0KZ2RwX2dyb3d0aCAlPD4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlllYXIiLCAKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImdkcF9ncm93dGgiKSAlPiUKICByZW5hbWUoQ291bnRyeT1jb3VudHJ5KSAlPiUKICBtdXRhdGUoWWVhciA9YXMubnVtZXJpYyhZZWFyKSkgJT4lCiAgIyAgdGlkeXI6OmRyb3BfbmEoKSAlPiUgIyBub3Qgc3VyZSB3ZSBuZWVkIHRoaXMuLgogIHJlbmFtZShgR0RQIEdyb3d0aC9DYXBpdGEgKCUpYCA9IGdkcF9ncm93dGgpCmBgYAoKTm93IGxldCdzIHNlZSBob3cgdGhpcyBkYXRhIGhhcyBjaGFuZ2VkOgoKYGBge3J9CmdkcF9ncm93dGggJT4lCiAgaGVhZCgpCgpnZHBfZ3Jvd3RoICU+JQogIGNvdW50KFllYXIpCmBgYAoKIyMjIEVuZXJneSBVc2UgcGVyIFBlcnNvbgoKTm93IGxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBlbmVyZ3kgdXNlIHBlciBwZXJzb24gZGF0YToKCmBgYHtyfQplbmVyZ3lfdXNlICU+JQogIGhlYWQoKQpgYGAKCiMjIyMgey5zY3JvbGxhYmxlfQpgYGB7cn0KZW5lcmd5X3VzZSAlPiUKICBnbGltcHNlKCkKYGBgCiMjIyMKClRvIHdyYW5nbGUgdGhlIGBlbmVyZ3lfdXNlYCBkYXRhLCB3ZSB3aWxsIGFnYWluIGNvbnZlcnQgdGhlIGRhdGEgdG8gbG9uZyBmb3JtYXQsIHJlbmFtZSBzb21lIHZhcmlhYmxlcywgYW5kIG11dGF0ZSB0aGUgYFllYXJgIGRhdGEgdG8gYmUgbnVtZXJpYy4KCmBgYHtyfQplbmVyZ3lfdXNlICU8PiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LCBuYW1lc190byA9ICJZZWFyIiwgdmFsdWVzX3RvID0gImVuZXJneV91c2UiKSAlPiUKICByZW5hbWUoQ291bnRyeT1jb3VudHJ5KSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhcikpICU+JQogIHJlbmFtZShgRW5lcmd5IFVzZSAoa2csIG9pbC1lcS4vY2FwaXRhKWAgPSBlbmVyZ3lfdXNlKQoKYGBgCgojIyMjIHsuc2Nyb2xsYWJsZX0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKZW5lcmd5X3VzZSAlPiUKZ2xpbXBzZSgpCmBgYAojIyMjCgojIyMgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUKCmBgYHtyfQptb3J0YWxpdHkgJT4lCiAgaGVhZCgpCmBgYAoKCldlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgZW1wdHkgcm93cyB3aGljaCBpbmRpY2F0ZSB3aGVuIHRoZSBkYXRhIHdhcyB1cGRhdGVkLgpXZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGUgY29sdW1ucyByZWFsbHkgc3RhcnQgYXQgdGhlIDNyZCByb3cuIFNvIGZpcnN0IHdlIHdpbGwgcmVwYWNlIHRoZSBjb2x1bW4gbmFtZXMgd2l0aCB0aGUgM3JkIHJvdy4gVGhlbiB3ZSB3aWxsIHJlbW92ZSB0aGUgZmlyc3QgMyByb3dzLgoKYGBge3J9CmNvbG5hbWVzKG1vcnRhbGl0eSkKY29sbmFtZXMobW9ydGFsaXR5KSA8LSBtb3J0YWxpdHlbMyxdCmNvbG5hbWVzKG1vcnRhbGl0eSkKbW9ydGFsaXR5IDwtIG1vcnRhbGl0eVstYygxOjMpLF0KYGBgCgoKCiMjIyMgey5zY3JvbGxhYmxlfQpgYGB7cn0KbW9ydGFsaXR5ICU+JQogIGdsaW1wc2UoKQoKYGBgCiMjIyMKCgpUaGF0IGlzIGxvb2tpbmcgYmV0dGVyISBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gcmVtb3ZlIHNvbWUgdmFyaWFibGVzIGxpa2U6IGBDb3VudHJ5IENvZGVgLCBgSW5kaWNhdG9yIE5hbWVgLCBhbmQgYEluZGljYXRvciBDb2RlYC4gV2UgY2FuIGRvIHRoYXQgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3RpbyBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiBXZSBjYW4gdXNlIHRoZSBtaW51cyBzaWduIGAtYCB0byBpbmRpY2F0ZSB3aGF0IHZhcmlhYmxlcyB3ZSBkb250IHdhbnQgdG8ga2VlcC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIHBlcmZvcm0gc2ltaWxhciBtb2RpZmljYXRpb25zIGFzIHdlIHBlcmZvcm1lZCBvbiB0aGUgb3RoZXIgZGF0YXNldHMuCgpgYGB7cn0KbW9ydGFsaXR5ICU8PiUKICBzZWxlY3QoLWBDb3VudHJ5IENvZGVgLAogICAgICAgICAtYEluZGljYXRvciBOYW1lYCwKICAgICAgICAgLWBJbmRpY2F0b3IgQ29kZWApICU+JQogIHJlbmFtZShDb3VudHJ5ID0gIkNvdW50cnkgTmFtZSIpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLUNvdW50cnksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJZZWFyIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJEZWF0aHMvMTAwMCBQZW9wbGUiKSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhcikpICU+JQogIG11dGF0ZShgRGVhdGhzLzEwMDAgUGVvcGxlYCA9IGFzLm51bWVyaWMoYERlYXRocy8xMDAwIFBlb3BsZWApKQoKYGBgCgpgYGB7cn0KbW9ydGFsaXR5ICU+JQogIGhlYWQoKQpgYGAKCgojIyBVUy1zcGVjaWZpYyBEYXRhCk5vdyB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoZSBVUyBkYXRhIGFib3V0IGRpc2FzdGVycyBhbmQgdGVtcGVyYXR1cmUuCgojIyMgRGlzYXN0ZXJzCgpgYGB7cn0KdXNfZGlzYXN0ZXIgICU+JQogIGhlYWQoKQpgYGAKCldlIGFyZSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiB0aGUgYFllYXJgIGFuZCAgdGhlIHZhcmlhYmxlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmQgYCJDb3VudCJgIHNvIHdlIHdpbGwgc2VsZWN0IHRoZW0gdXNpbmcgdGhlIGBzZWxlY3QoKWAgYW5kIGBjb250YWlucygpYCBmdW5jdGlvbnMgaW4gdGhlIGBkcGx5cmAgcGFja2FnZS4gU2luY2Ugd2UgYXJlIHNlbGVjdGluZyBmb3IgdmFyaWFibGVzIHdpdGggdGhlIHdvcmQgYCJDb3VudCJgIHdlIG5lZWQgdG8gdXNlIHF1b3RhdGlvbiBtYXJrcyBhcm91bmQgaXQuIFNlbGVjdGluZyBmb3IgdGhlIHZhcmlhYmxlIGB5ZWFyYCBkb2VzIG5vdCByZXF1aXJlIHRoaXMgYXMgdGhhdCBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGV4aXN0aW5nIHZhcmlhYmxlcy4KCgpgYGB7cn0KdXNfZGlzYXN0ZXIgJTw+JQogICAgICAgICAgIHNlbGVjdChZZWFyLCBjb250YWlucygiQ291bnQiKSkKCnVzX2Rpc2FzdGVyICU+JQogIGhlYWQoKQpgYGAKCk5vdyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgdGhlIHN1bSBvZiBhbGwgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkaXNhc3RlcnMgZm9yIGVhY2ggeWVhci4gCgpXZSBjYW4gY3JlYXRlIHRoaXMgbmUgdmFyaWFibGUgdXNpbmcgdGhlIGBtdXRhdGUoKWAgZnVuY3Rpb24gb2YgYGRwbHlyYCBhbmQgd2Ugd2lsbCB1c2UgdGhlIGJhc2UgYHJvd1N1bXMoKWAgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24uIFdlIGRvbnQgd2FudCB0byBpbmNsdWRlIHRoZSBgWWVhcmAgdmFyaWFibGUgaW4gb3VyIHN1bSwgc28gd2UgY2FuIGV4Y2x1ZGUgaXQgdXNpbmcgdGhlIGBzZWxlY3RgZnVuY3Rpb24gd2l0aGluIHRoZSBgcm93U3VtcygpYCBmdW5jdGlvbi4gSG93ZXZlciwgdG8gZG8gc28gd2UgbmVlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSB1c2luZyB0aGUgZGF0YSB0aGF0IHdlIGFscmVhZHkgdXNlZCBhcyBpbnB1dCB0byBvdXIgYG11dGF0ZSgpYCBhbmQgYHJvd1N1bXMoKWAgZnVuY3Rpb25zLiBXZSBjYW4gZG8gc28gYnkgdXNpbmcgYSBgLmAuIAoKCmBgYHtyfQp1c19kaXNhc3RlciAlPD4lCiAgbXV0YXRlKGBEaXNhc3RlcnNgID0gcm93U3VtcyhzZWxlY3QoLiwgLVllYXIpKSkgCgp1c19kaXNhc3RlciAlPiUKICBnbGltcHNlKCkKYGBgCgpHcmVhdCwgbm93IHdlIGFyZSBnb2luZyB0byByZW1vdmUgc29tZSBvZiB0aGVzZSB2YXJpYWJsZXMgYW5kIGp1c3Qga2VlcCBvciBzZWxlY3QgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3Rpb24gdGhlIHZhcmlhYmxlcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gV2Ugd2lsbCBrZWVwIHRoZSBgRmxvb2RpbmcgQ291bnRgIGJlY3Vhc2UgYXMgeW91IG1heSByZWNhbGwgZnJvbSBlYXJsaWVyIGluIHRoaXMgY2FzZSBzdHVkeSwgZXZlbnRzIG9mIGV4dHJlbWUgcGVyY2lwdGF0aW9uIGxldmVscyBhcHBlYXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGdsb2JhbCB3YXJtaW5nLiBXZSB3aWxsIHVzZSB0aGlzIGFzIGEgcHJveHkgZm9yIHRoYXQuCgpBVk9DQURPIHdoeSBpcyBVUyBsaXN0ZWQgaW4gMyB2YXJpYWJsZXM/CldlIGFyZSBhbHNvIGdvaW5nIHRvIGFkZCBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYENvdW50cnlgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBkYXRhIGlzIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdmFyaWFibGUgd2hlcmUgZXZlcnkgdmFsdWUgaXMgYFVuaXRlZCBTdGF0ZXNgLiBXZSB3aWxsIGFsc28gY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGNhbGxlZCBgUmVnaW9uYCB3aGVyZSBldmVyeSB2YWx1ZSBpcyBgVVMtc3BlY2lmaWNgIGFuZCBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYFR5cGVgIHdoZXJlIGV2ZXJ5IHZhbHVlIGlzIGBVbml0ZWQgU3RhdGVzYC4KCmBgYHtyfQp1c19kaXNhc3RlciAlPD4lCiAgZHBseXI6OnNlbGVjdChZZWFyLAogICAgICAgICAgICAgICAgRGlzYXN0ZXJzKSAlPiUKICBtdXRhdGUoQ291bnRyeSA9ICJVbml0ZWQgU3RhdGVzIikgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1Db3VudHJ5LCAtIFllYXIpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJJbmRpY2F0b3IiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUKICBtdXRhdGUoUmVnaW9uID0gIlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgIFR5cGUgPSAiVVMtc3BlY2lmaWMiKQoKaGVhZCh1c19kaXNhc3RlcikKYGBgCgoKCiMjIyBUZW1wZXJhdHVyZQoKYGBge3J9CnVzX3RlbXBlcmF0dXJlICU+JQogIGhlYWQoKQpgYGAKT0ssIHNvIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBgQW5vbWFseWAgdmFyaWFibGUgd2hpY2ggaXMgYW4gaW5kaWNhdG9yIG9mIGhvdyBkaWZmZXJlbnQgdGhlIG5hdGlvbmFsIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgZm9yIHRoYXQgeWVhciB3YXMgZnJvbSB0aGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSBmcm9tIDE5MDEtMjAwMCB3aGljaCB3YXMgNTIuMDImZGVnO0YuIAoKV2UgYWxzbyB3YW50IHRvIGNoYW5nZSB0aGUgZGF0ZSB2YWx1ZXMsIHdoaWNoIGFyZSBjdXJyZW50bHkgbGlzdGVkIGFzIHRoZSB5ZWFyIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgMTIuIFRvIGRvIHNvIHdlIHdhbnQgdG8ganVzdCBrZWVwIHRoZSBmaXJzdCA0IGNoYXJhY3RlcnMgaW4gdGhlIGBEYXRlYCB2YXJpYWJsZSBzdHJpbmcgdmFsdWVzLiBXZSBjYW4gdXNlIHRoZSBgc3RyX3N1YigpYCBmdW5jdGlvbiBvZiB0aGUgYHN0cmluZ3JgIHBhY2thZ2UgdG8gZG8gdGhpcy4gV2UganVzdCBuZWVkIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzLiBJbiB0aGlzIGNhc2UgdGhlIHN0YXJ0IHdvdWxkIGJlIDEgYW5kIHRoZSA0dGggY2hhcmFjdGVyIHdvdWxkIGJlIHdoZXJlIHdlIHdhbnQgdG8gc3RvcCwgc28gd2Ugd291bGQgdXNlIGBzdGFydCA9IDEsIHN0b3AgPSA0YC4gQWdhaW4gd2Ugd2lsbCBjcmVhdGUgYSBgQ291bnRyeWAsIGBSZWdpb25gIGFuZCBgVHlwZWAgdmFyaWFibGUuIFdlIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGBEYXRlYCB2YXJpYWJsZSB0byBgWWVhcmAgc28gdGhhdCBpdCB3aWxsIGJlIGNvbnNpc3RlbnQgd2l0aCBvdXIgb3RoZXIgZGF0YXNldHMuIEZ1cnRoZXJtb3JlLCB3ZSBhbHNvIHdoYXQgaXQgdG8gYmUgbnVtZXJpYy4gV2UgY2FuIGFjY29tcGxpc2ggYm90aCByZW5hbWluZyBhbmQgY2hhbmdpbmcgdG8gbnVtZXJpYyBieSB1c2luZyB0aGUgYG11dGF0ZSgpYCBmdW5jdGlvbi4gV2UgY2FudGhlbiByZW1vdmUgdGhlIGBEYXRlYCB2YXJpYWJsZSBhbmQgYWxzbyBvcmRlciB0aGUgY29sdW1ucyBqdXN0IGxpa2UgdGhlIG90aGVyIHVzIGRhdGEgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3Rpb24uCgpgYGB7cn0KdXNfdGVtcGVyYXR1cmUgJTw+JQogIGRwbHlyOjpzZWxlY3QoLUFub21hbHkpICU+JQogIG11dGF0ZShEYXRlID0gc3RyX3N1YihEYXRlLCBzdGFydCA9IDEsIGVuZCA9IDQpKSU+JQogIHJlbmFtZSgpICU+JQogIG11dGF0ZShZZWFyID0gYXMubnVtZXJpYyhEYXRlKSwgCiAgICAgIENvdW50cnkgPSAiVW5pdGVkIFN0YXRlcyIsCiAgICBJbmRpY2F0b3IgPSAiVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpIiwKICAgICAgIFJlZ2lvbiA9ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgVHlwZSA9ICJVUy1zcGVjaWZpYyIpICU+JQogIHNlbGVjdChZZWFyLCBDb3VudHJ5LCBJbmRpY2F0b3IsICBWYWx1ZSwgUmVnaW9uLCBUeXBlKQoKaGVhZCh1c190ZW1wZXJhdHVyZSkKYGBgCgojIyBKb2luaW5nIGRhdGEKCk5vdyB3ZSB3b3VsZCBsaWtlIHRvIGpvaW4gdGhlIGRpZmZlcmVudCBkYXRhc2V0cyB0b2dldGhlciBpbnRvIG9uZSB0aWJibGUuIFRvIGRvIHNvIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBoYXZlIGF0IGxlYXN0IG9uZSBjb2x1bW4gb3IgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVzZWQgYXMgYSBrZXkgZm9yIHB1dHRpbmcgeW91ciBkYXRhIHRvZ2V0aGVyLiBUbyBwdXQgYWxsIG9mIG91ciBkYXRhIHRvZ2V0aGVyIHRoZXJlIGFyZSBzZXZlcmFsIGAqX2pvaW4oKWAgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgYGRwbHlyYCBwYWNrYWdlLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImpvaW4ucG5nIikpCmBgYAoKV2Ugd2lsbCB1c2UgdGhlIGBmdWxsX2pvaW4oKWAgZnVuY3Rpb24gYXMgd2UgaGF2ZSBkaWZmZXJlbnQgdGltZSBzcGFucyBmb3IgZWFjaCBkYXRhc2V0IGFuZCB3ZSB3b3VsZCBsaWtlIHRvIHJldGFpbiBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUuIFRoZWBmdWxsX2pvaW4oKWAgZnVuY3Rpb24gd2lsbCBzaW1wbHkgY3JlYXRlIGBOQWAgdmFsdWVzIGZvciBhbnkgb2YgdGhlIHllYXJzIHRoYXQgYXJlIG5vdCBpbiBvbmUgb2YgdGhlIGRhdGEgc2V0cy4gV2UgY2FuIGNoZWNrIGJ5IHVzaW5nIHRoZSBiYXNlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYWxzbyBhbGxvdyB1cyB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgY29uc2lzdGVudCBpbiBlYWNoIGRhdGFzZXQgdGhhdCB3ZSB3aXNoIHRvIGNvbWJpbmUuCgpgYGB7cn0Kc3VtbWFyeShDTzJfZW1pc3Npb25zKQpzdW1tYXJ5KGdkcF9ncm93dGgpCnN1bW1hcnkoZW5lcmd5X3VzZSkKc3VtbWFyeShtb3J0YWxpdHkpCgpgYGAKCkluZGVlZCwgYENvdW50cnlgLCBhbmQgYFllYXJgIHZhcmlhYmxlcyBhcmUgcHJlc2VudCBpbiBhbGwgb2YgdGhlIGRhdGFzZXRzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhciBpcyBkaWZmZXJlbnQgZm9yIG5lYXJseSBhbGwgdGhlIGRhdGFzZXRzLgoKV2UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgY29sdW1ucy92YXJpYWJsZXMgd2Ugd2lsbCBiZSBqb2luaW5nIGJ5IHVzaW5nIHRoZSBgYnkgPWAgYXJndW1lbnQgaW4gdGhlIGBmdWxsX2pvaW4oKWAgZnVuY3Rpb24uCgpgYGB7cn0KCmRmX3dpZGUgPC0gQ08yX2VtaXNzaW9ucyAlPiUKICBmdWxsX2pvaW4oZ2RwX2dyb3d0aCwgYnkgPSBjKCJDb3VudHJ5IiwgIlllYXIiKSkgJT4lCiAgZnVsbF9qb2luKGVuZXJneV91c2UsIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpICU+JQogIGZ1bGxfam9pbihtb3J0YWxpdHksIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpCgpkZl93aWRlICU+JQogIGhlYWQoKQpgYGAKCldlIGNhbiBhbHNvIGRvIHRoZSBzYW1lIHRoaW5nIHVzaW5nIGJ5IHVzaW5nIHRoZWByZWR1Y2UoKWAgZnVuY3Rpb24gb2YgdGhlIGBwdXJycmAgcGFja2FnZS4gVGhpcyBpcyBhIGdvb2Qgb3B0aW9uIGlmIHlvdSBoYXZlIG1hbnkgZGFzYXNldHMgdG8gY29tYmluZS4KCgpgYGB7cn0KZGZfd2lkZSA8LSBsaXN0KENPMl9lbWlzc2lvbnMsIAogICAgICAgICAgICAgICAgZ2RwX2dyb3d0aCwgCiAgICAgICAgICAgICAgICBlbmVyZ3lfdXNlLCAKICAgICAgICAgICAgICAgIG1vcnRhbGl0eSkgJT4lIAogIHJlZHVjZShmdWxsX2pvaW4sIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpCgpkZl93aWRlICU+JQogIGhlYWQoKQpgYGAKCmBgYHtyfQpkZl93aWRlICU+JQogIGdsaW1wc2UoKQpgYGAKCk5pY2UsIGxvb2tzIGdvb2QhCgpXZSB3aWxsIGFsc28gbWFrZSBhIGxvbmcgdmVyc2lvbiBvZiB0aGlzIGRhdGEsIHdoZXJlIHdlIHdpbGwgY3JlYXRlIGFuIG5ldyB2YXJpYWJsZSBjYWxsZWQgYEluZGljYXRvcmAgdGhhdCB3aWxsIGluZGljYXRlIHdoYXQgZGF0YXNldCB0aGUgZGF0YSBjYW1lIGZyb20gYW5kIHdlIHdpbGwgY29sbGFwc2UgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb2x1bW5zIGNhbGxlZCBgIEVtaXNzaW9uc2AsIChgQ08yIEVtaXNzaW9ucyAoTWcpYCksIGBHRFAgR3Jvd3RoL0NhcGl0YSAoJSlgLCBgRW5lcmd5IFVzZSAoa2csIG9pbC1lcS4vY2FwaXRhKWAsIGFuZCBgRGVhdGhzLzEwMDAgUGVvcGxlYC4gCgoKYGBge3J9CmRmX2xvbmcgPC0gZGZfd2lkZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoLUNvdW50cnksIC1ZZWFyKSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkluZGljYXRvciIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKQpoZWFkKGRmX2xvbmcpCmBgYAoKV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYFJlZ2lvbmAgdGhhdCB3aWxsIGluZGljYXRlIGlmIHRoZSBkYXRhIGlzIGFib3V0IHRoZSBVbml0ZWQgU3RhdGVzIG9yIGEgZGlmZmVyZW50IGNvdW50cnkgYmFzZWQgb24gdGhlIHZhbHVlcyBpbiB0aGUgYENvdW50cnlgIHZhcmlhYmxlLiBXZSB3aWxsIHVzZSB0aGUgYGNhc2Vfd2hlbigpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlIHRvIGRvIHRoaXMuIElmIHRoZSBgQ291bnRyeWAgdmFyaWFibGUgaXMgZXF1YWwgdG8gYCJVbml0ZWQgU3RhdGVzImAgdGhlIHZhbHVlIGZvciB0aGUgbmV3IHZhcmlhYmxlIHdpbGwgYWxzbyBiZSAiVW5pdGVkIFN0YXRlcyIsIHdoZXJlIGFzIGlmIHRoZSBgQ291bnRyeWAgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIGAiVW5pdGVkIFN0YXRlcyJgIGJ1dCBpcyBzb21lIG90aGVyIGNoYXJhY3RlciBzdHJpbmcgdmFsdWUsIHN1Y2ggYXMgYCJBZmdoYW5pc3RhbiJgLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIG5ldyB2YXJpYWJsZSB3aWxsIGJlIGAiUmVzdCBvZiB0aGUgV29ybGQiYC4KVGhlIG5ldyB2YWx1ZXMgZm9yIHRoZSBuZXcgdmFyaWFibGUgYFJlZ2lvbmAgYXJlIGluZGljYXRlZCBhZnRlciB0aGUgc3BlY2lmaWMgY29uZGl0aW9uYWwgc3RhdGVtZW50cyBieSB1c2luZyB0aGUgYH5gIHN5bWJvbC4gV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYFR5cGVgLCB3aGVyZSBhbGwgdGhlIHZhbHVlcyBhcmUgYCJHbG9iYWwiYCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgZGF0YSBpcyBub3Qgc3BlY2lmaWMgdG8ganVzdCB0aGUgVW5pdGVkIFN0YXRlcy4gCgoKYGBge3J9CiBkZl9sb25nICU8PiUKICBtdXRhdGUoUmVnaW9uID0gY2FzZV93aGVuKENvdW50cnk9PSJVbml0ZWQgU3RhdGVzIiB+ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5IT0iVW5pdGVkIFN0YXRlcyIgfiAiUmVzdCBvZiB0aGUgV29ybGQiKSwKICAgICAgICAgVHlwZSA9ICJHbG9iYWwiKQpoZWFkKGRmX2xvbmcpCmBgYAoKV2Ugd2lsbCBub3cgY29tYmluZSB0aGlzIGRhdGEgd2l0aCB0aGUgVVMgZGF0YSBhYm91dCBkaXNhc3RlcnMgYW5kIHRlbXBlcmF0dXJlcy4KCldlIHdpbGwgbm93IHVzZSB0aGUgYGJpbmRfcm93cygpYCBmdW5jdGlvbiB3aGljaCB3aWxsIGp1c3QgYXBwZW5kIHRoZSBgdXNfdGVtcGVyYXR1cmVgIGRhdGEgYW5kIHRoZSBgdXNfZGlzYXN0ZXJgIGRhdGEgYWZ0ZXIgdGhlIGBkZl9sb25nYCBkYXRhLiAKCgpgYGB7cn0KaGVhZCh1c19kaXNhc3RlcikKaGVhZCh1c190ZW1wZXJhdHVyZSkKCmRmX2xvbmcgPC1saXN0KGRmX2xvbmcsIAogICAgICAgICAgICAgICB1c19kaXNhc3RlciwKICAgICAgICAgICAgICAgdXNfdGVtcGVyYXR1cmUpICU+JQogIGJpbmRfcm93cygpCmRmX2xvbmckQ291bnRyeSA8LSBhcy5mYWN0b3IoZGZfbG9uZyRDb3VudHJ5KQpgYGAKCldlIGNhbiBjaGVjayB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG5ldyBgZGZfbG9uZ2AgdGliYmxlIHRvIHNlZSB0aGF0IG91ciBgdXNfdGVtcGVyYXR1cmVgIGRhdGEgaXMgYXQgdGhlIGJvdHRvbS4KCmBgYHtyfQpoZWFkKGRmX2xvbmcpCnRhaWwoZGZfbG9uZykKYGBgCgoKPGRldGFpbHM+IDxzdW1tYXJ5PiBDbGljayBoZXJlIGZvciBkZXRhaWxzIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYGZ1bGxfam9pbigpYCBhbmQgYGJpbmRfcm93cygpYCA8L3N1bW1hcnk+CgpUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBgZnVsbF9qb2luKClgIGZ1bmN0aW9uIGlzIHRoYXQgdGhlIGBiaW5kX3Jvd3MoKWAgZnVuY3Rpb24gd2lsbCBhc3NlbnRpYWxseSBqdXN0IGFwcGVuZCBlYWNoIGRhdGFzZXQgdG8gZWFjaCBvdGhlciwgd2hlcmVhcyB0aGUgYGZ1bGxfam9pbigpYCBmdW5jdGlvbiBjb2xsYXBzZXMgZGF0YSB0aGF0IGlzIGNvbXBhcmFibGUuIEhlcmUgeW91IHdpbGwgc2VlIGFuIGV4YW1wbGUgb2Ygd2hhdCB0aGUgZGF0YSB3b3VsZCBoYXZlIGJlZW4gbGlrZSBmb3IgYGRmX3dpZGVgIGlmIHdlIGhhZCBtYWRlIGl0IHVzaW5nIGBiaW5kX3Jvd3MoKWAuCgpgYGB7cn0KZGZfd2lkZV9iciA8LSBsaXN0KENPMl9lbWlzc2lvbnMsIAogICAgICAgICAgICAgICAgZ2RwX2dyb3d0aCwgCiAgICAgICAgICAgICAgICBlbmVyZ3lfdXNlLCAKICAgICAgICAgICAgICAgIG1vcnRhbGl0eSkgJT4lIAogIGJpbmRfcm93cygpCgpkaW0oZGZfd2lkZSkKZGltKGRmX3dpZGVfYnIpCgpkZl93aWRlJT4lCiAgZmlsdGVyKENvdW50cnkgPT0gIkNoaW5hIiwgWWVhciA9PSAiMTk2MCIpCgpkZl93aWRlX2JyJT4lCiAgZmlsdGVyKENvdW50cnkgPT0gIkNoaW5hIiwgWWVhciA9PSAiMTk2MCIpCmBgYAo8L2RldGlhbHM+CgoKQVZPQ0FETyBIbW1tIHRoZSB0b3AgcGxvdCBjaGFuZ2VzIGNvbXBsZXRlbHkgaWYgd2UgZHJvcCBjb3VudHJpZXMgd2l0aCBuYSB2YWx1ZXMuLi4gCmBgYHtyfQpkZl9sb25nX3dpdGhfbWlzcyA8LSBkZl9sb25nICU+JQogIGFycmFuZ2UoQ291bnRyeSkKCmRmX2xvbmc8LSBkZl9sb25nICU+JQogIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkgJT4lCiAgYXJyYW5nZShDb3VudHJ5KQoKCmhlYWQoZGZfbG9uZ193aXRoX21pc3MpCmhlYWQoZGZfbG9uZykKCmBgYAoKCgoKIyMgKipEYXRhIEV4cGxvcmF0aW9uKioKKioqIApOb3cgd2Ugd2lsbCBjcmVhdGUgc29tZSBzaW1wbGUgcGxvdHMgdG8gZXhhbWluZSB0aGUgZGF0YS4KCiMjIyBDTzIgRW1pc3Npb25zICgxNzUxLTIwMTQpCgpXZSBjYW4gY2hlY2sgdGhlIHRpbWUgc3BhbiBvZiB0aGlzIGRhdGEgYnkgcmVmZXJpbmcgYmFjayB0byB0aGUgIFsqKldoYXQgYXJlIHRoZSBkYXRhPyoqXSBzZWN0aW9uLgoKYGBge3J9CgojIENPMl9lbWlzc2lvbnMgJT4lCiMgICAjIHJlbmFtZShgQ08yIEVtaXNzaW9ucyAoTWcpYD0gRW1pc3Npb25zKSAlPiUKIyBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gQ08yIEVtaXNzaW9ucyAoTWcpYCwgZ3JvdXA9Q291bnRyeSkpICsKIyAgIGdlb21fbGluZShhbHBoYT0wLjIpICsgCiMgICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiQ291bnRyeSBDTyJbMl0qIiBFbWlzc2lvbnMgcGVyIFllYXIgLCAxNzUxLTIwMTQiKSwKIyAgICAgICAgY2FwdGlvbiA9IGV4cHJlc3Npb24oIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIpKSArIAojICAgeWxhYigiRW1pc3Npb25zICgxTSBNZXRyaWMgVG9ubmVzKSIpCiMgCiMgQ08yX3dvcmxkPC1DTzJfZW1pc3Npb25zICU+JQojICAjIHJlbmFtZShgQ08yIEVtaXNzaW9ucyAoTWcpYD0gRW1pc3Npb25zKSAlPiUKIyAgIGdyb3VwX2J5KFllYXIpICU+JQojICAgc3VtbWFyaXNlKGBDTzIgRW1pc3Npb25zIChNZylgID0gc3VtKGBDTzIgRW1pc3Npb25zIChNZylgLCBuYS5ybSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBDTzIgRW1pc3Npb25zIChNZylgKSkgKwojICAgZ2VvbV9saW5lKCkgKyAKIyAgIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJXb3JsZCBDTyJbMl0qIiBFbWlzc2lvbnMgcGVyIFllYXIgLCAxNzUxLTIwMTQiKSwKIyAgICAgICAgY2FwdGlvbiA9IGV4cHJlc3Npb24oIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIpKSArIAojICAgeWxhYigiRW1pc3Npb25zICgxTSBNZXRyaWMgTWV0cmljIFRvbm5lcykiKQojIENPMl93b3JsZAoKZGZfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJFbWlzc2lvbnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT0gVmFsdWUsIGdyb3VwPUNvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFscGhhPTAuMikgKyAKICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiQ291bnRyeSBDTyJbMl0qIiBFbWlzc2lvbnMgcGVyIFllYXIgLCAxNzUxLTIwMTQiKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJFbWlzc2lvbnMgKDFNIE1ldHJpYyBUb25uZXMpIikKCkNPMl93b3JsZDwtZGZfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJFbWlzc2lvbnMiLAogICAgICAgICBZZWFyIDw9IDIwMTQpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShWYWx1ZSA9IHN1bShWYWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxLjUpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIldvcmxkIENPIlsyXSoiIEVtaXNzaW9ucyBwZXIgWWVhciAsIDE3NTEtMjAxNCIpLAogICAgICAgY2FwdGlvbiA9IGV4cHJlc3Npb24oIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIpKSArIAogIHlsYWIoIkVtaXNzaW9ucyAoMU0gTWV0cmljIE1ldHJpYyBUb25uZXMpIikrCiAgdGhlbWVfbGluZWRyYXcoKQpDTzJfd29ybGQKCmBgYAoKCiMjIyBZZWFybHkgR3Jvd3RoIGluIEdEUCBwZXIgQ2FwaXRhICgxODAxIHRvIDIwMTkpCgpgYGB7cn0KIyBnZ3Bsb3QoZ2RwX2dyb3d0aCwgYWVzKHg9WWVhciwgeT1gR0RQIEdyb3d0aC9DYXBpdGEgKCUpYCwgZ3JvdXA9Q291bnRyeSkpICsKIyAgIGdlb21fbGluZShhbHBoYT0wLjIpICsgCiMgICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiQ291bnRyeSBHRFAgR3Jvd3RoIHBlciBDYXBpdGEgcGVyIFllYXIgKEFubnVhbCAlKSwgMTgwMS0yMDE5IiksCiMgICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKIyAgIHlsYWIoIkdEUCBHcm93dGggcGVyIENhcGl0YSAoQW5udWFsICUpIikKIyAKIyBnZHBfZ3Jvd3RoICU+JQojICAgZ3JvdXBfYnkoWWVhcikgJT4lCiMgICBzdW1tYXJpc2UoYEdEUCBHcm93dGgvQ2FwaXRhICglKWAgPSBtZWFuKGBHRFAgR3Jvd3RoL0NhcGl0YSAoJSlgLCBuYS5ybSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBHRFAgR3Jvd3RoL0NhcGl0YSAoJSlgKSkgKwojICAgZ2VvbV9saW5lKCkgKyAKIyAgIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJNZWFuIENvdW50cnkgR0RQIEdyb3d0aCBwZXIgQ2FwaXRhIHBlciBZZWFyIChBbm51YWwgJSksIDE4MDEtMjAxOSIpLAojICAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiMgICB5bGFiKCJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpCgpkZl9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkdEUCBHcm93dGgvQ2FwaXRhICglKSIsIAogICAgICAgICBZZWFyID49IDE4MDEpICU+JQpnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGE9MC4yKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IEdEUCBHcm93dGggcGVyIENhcGl0YSBwZXIgWWVhciAoQW5udWFsICUpLCAxODAxLTIwMTkiKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpCgpkZl9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkdEUCBHcm93dGgvQ2FwaXRhICglKSIsCiAgICAgICAgIFllYXIgPj0gMTgwMSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKFZhbHVlID0gbWVhbihWYWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiTWVhbiBDb3VudHJ5IEdEUCBHcm93dGggcGVyIENhcGl0YSBwZXIgWWVhciAoQW5udWFsICUpLCAxODAxLTIwMTkiKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpCmBgYAoKIyMjIEVuZXJneSBVc2UgcGVyIFBlcnNvbiAoMTk2MCB0byAyMDE1KQoKYGBge3J9CiMgZ2dwbG90KGVuZXJneV91c2UsIGFlcyh4PVllYXIsIHk9YEVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSlgLCBncm91cD1Db3VudHJ5KSkgKwojICAgZ2VvbV9saW5lKGFscGhhPTAuMikgKyAKIyAgIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IEVuZXJneSBVc2UgKGtnIG9mIE9pbCBFcXVpdmFsZW50IHBlciBDYXBpdGEpLCAxOTYwIHRvIDIwMTUiLCksCiMgICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKIyAgIHlsYWIoIkVuZXJneSBVc2UgKGtnIG9mIE9pbCBFcXVpdmFsZW50IHBlciBDYXBpdGEpIikKIyAKIyBlbmVyZ3lfdXNlICU+JQojICAgZ3JvdXBfYnkoWWVhcikgJT4lCiMgICBzdW1tYXJpc2UoYEVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSlgID0gc3VtKGBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpYCwgbmEucm0gPSBUUlVFKSkgJT4lCiMgICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gRW5lcmd5IFVzZSAoa2csIG9pbC1lcS4vY2FwaXRhKWApKSArCiMgICBnZW9tX2xpbmUoKSArIAojICAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIldvcmxkd2lkZSBFbmVyZ3kgVXNlIChrZyBvZiBPaWwgRXF1aXZhbGVudCBwZXIgQ2FwaXRhKSwgMTk2MCB0byAyMDE1IiksCiMgICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKIyAgIHlsYWIoIkVuZXJneSBVc2UgKGtnIG9mIE9pbCBFcXVpdmFsZW50IHBlciBDYXBpdGEpIikKCgpkZl9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSkiLAogICAgICAgICAgICAgIFllYXIgPj0gMTk2MCwgCiAgICAgICAgICAgICAgWWVhciA8PSAyMDE1KSAlPiUKZ2dwbG90KGFlcyh4PVllYXIsIHk9IFZhbHVlLCBncm91cD1Db3VudHJ5KSkgKwogIGdlb21fbGluZShhbHBoYT0wLjIpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIkNvdW50cnkgRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSksIDE5NjAgdG8gMjAxNSIsKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJFbmVyZ3kgVXNlIChrZyBvZiBPaWwgRXF1aXZhbGVudCBwZXIgQ2FwaXRhKSIpCgpkZl9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSkiLAogICAgICAgICAgICAgIFllYXIgPj0gMTk2MCwgCiAgICAgICAgICAgICAgWWVhciA8PSAyMDE1KSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoVmFsdWUgPSBzdW0oVmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlKSkgKwogIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIldvcmxkd2lkZSBFbmVyZ3kgVXNlIChrZyBvZiBPaWwgRXF1aXZhbGVudCBwZXIgQ2FwaXRhKSwgMTk2MCB0byAyMDE1IiksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSkiKQpgYGAKCiMjIyBDcnVkZSBNb3J0YWxpdHkgUmF0ZQoKCmBgYHtyfQoKZGZfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMvMTAwMCBQZW9wbGUiLAogICAgICAgICAgICAgIFllYXIgPj0gMTk2MCwgCiAgICAgICAgICAgICAgWWVhciA8PSAyMDE5KSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGE9MC4yKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IENydWRlIE1vcnRhbGl0eSBSYXRlIChwZXIgMTAwMCBQZXJzb25zKSwgMTk2MCB0byAyMDE5IiksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikKCgpkZl9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkRlYXRocy8xMDAwIFBlb3BsZSIsCiAgICAgICAgICAgICAgWWVhciA+PSAxOTYwLCAKICAgICAgICAgICAgICBZZWFyIDw9IDIwMTkpICU+JQogICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoVmFsdWUgPSBtZWFuKFZhbHVlLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJNZWFuIENvdW50cnkgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpLCAxOTYwIHRvIDIwMTkiKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucykiKQogIApgYGAKCiMjIFVTLXNwZWNpZmljIERhdGEKCiMjIyBEaXNhc3RlcnMKCmBgYHtyfQoKZGZfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEaXNhc3RlcnMiLAogICAgICAgICAgICAgIFllYXIgPj0gMTk4MCwgCiAgICAgICAgICAgICAgWWVhciA8PSAyMDE5KSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiVVMgRGlzYXN0ZXJzLCAxOTgwIHRvIDIwMTkiKSwKICAgICAgIHN1YnRpdGxlID0gZXhwcmVzc2lvbigiRHJvdWd0aHMsIEZsb29kcywgRnJlZXplcywgU2V2ZXJlIFN0b3Jtcy4gVHJvcGljYWwgQ3ljbG9uZXMsIFdpbGRmaXJlcywgYW5kIFdpbnRlciBTdG9ybXMiKSkgKyAKICB5bGFiKCJEaXNhc3RlciBDb3VudCIpCiAgCmBgYAoKIyMjIFRlbXBlcmF0dXJlCgpgYGB7cn0KCmRmX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpIiwKICAgICAgICAgICAgICBZZWFyID49IDE4OTUsIAogICAgICAgICAgICAgIFllYXIgPD0gMjAxOSkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUsIGdyb3VwPUNvdW50cnkpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIlVTIEF2ZXJhZ2UgQW5udWFsIFRlbXBlcmF0dXJlLCAxODk1IHRvIDIwMTkiKSkrCiAgeWxhYigiVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpIikKCmBgYAoKCiMjIERhdGEgVmlzdWFsaXphdGlvbgoKCk5vdyBMZXQncyB0cnkgcHV0dGluZyB0aGUgZGF0YSB0b2dldGhlci4gCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ2dwbG90KGRmX2xvbmcsIGFlcyh4PVllYXIsIHk9VmFsdWUsIGdyb3VwPUNvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFscGhhPTAuMikgKyAKICBmYWNldF9ncmlkKEluZGljYXRvcn4uLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHlsYWIoIkluZGljYXRvciBWYWx1ZSIpICsgCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUiKQpgYGAKCiMjIFRpbWUgc3BhbnMgb2YgZGF0YQoKYGBge3J9CmRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGUgPT0gIkdsb2JhbCIpICU+JQogIGdyb3VwX2J5KFllYXIsIEluZGljYXRvciwgLmRyb3A9RkFMU0UpICU+JQogIHRhbGx5KCkgJT4lCiAgZ2dwbG90KGFlcyh4PSBZZWFyLCB5ID0gbiwgY29sb3IgPSBJbmRpY2F0b3IpKSArCiAgZ2VvbV9saW5lKCkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk4MCwgbGluZXR5cGU9MiwgY29sb3I9ImJsYWNrIikgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDE0LCBsaW5ldHlwZT0yLCBjb2xvcj0iYmxhY2siKSArCiAgbGFicyh0aXRsZSA9ICJDb3VudHJpZXMgd2l0aCBDb21wbGV0ZSBEYXRhIHBlciBZZWFyIiwKICAgICAgIHN1YnRpdGxlID0gIkdsb2JhbCBEYXRhIikgKyAKICB5bGFiKCJDb3VudHJpZXMiKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTc1MCwyMDIwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE3NTAsMjAyMCxieT0xMCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKCmRmX2xvbmcgJT4lCiAgZmlsdGVyKFJlZ2lvbj09IlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBncm91cF9ieShJbmRpY2F0b3IpICU+JQogIHN1bW1hcmlzZShTdGFydD1taW4oWWVhciksIEVuZD1tYXgoWWVhcikpICU+JQogIGdncGxvdChhZXMoeD1JbmRpY2F0b3IsIHk9RW5kKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDE5ODAsIGxpbmV0eXBlPTIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMDE0LCBsaW5ldHlwZT0yLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4PUluZGljYXRvciwKICAgICAgICAgICAgICAgICAgIHhlbmQ9SW5kaWNhdG9yLAogICAgICAgICAgICAgICAgICAgeWVuZD1FbmQsCiAgICAgICAgICAgICAgICAgICB5PVN0YXJ0KSkgKwogIGdlb21fcG9pbnQoYWVzKHg9SW5kaWNhdG9yLCB5PVN0YXJ0KSwgc2hhcGU9MTYsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3BvaW50KGFlcyh4PUluZGljYXRvciwgeT1FbmQpLCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICJDb21wbGV0ZSBEYXRhIHBlciBZZWFyIiwKICAgICAgIHN1YnRpdGxlID0gIlVTLXNwZWNpZmljIERhdGEiKSArIAogIHlsYWIoIkNvdW50cmllcyIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNzUwLDIwMjAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTc1MCwyMDIwLGJ5PTEwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciwgQW5pbWF0aW9uXzEsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9CmFuaW1hdGlvbl8xIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRGVhdGhzLzEwMDAgUGVvcGxlIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSwgY29sb3I9UmVnaW9uLCBzaXplPVJlZ2lvbixhbHBoYT1SZWdpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUmVkIiwiQmxhY2siKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKDAuMSwgMSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuMjUsIDIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUsIDE5ODAtMjAxMCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHlsYWIoIkNydWRlIE1vcnRhbGl0eSBSYXRlIikgKwogIHRyYW5zaXRpb25fdGltZShhcy5pbnRlZ2VyKFllYXIpKSArCiAgc2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAxLCBhbHBoYSA9IEZBTFNFKQoKYW5pbWF0ZShhbmltYXRpb25fMSwgZnBzID0gMTAsIGR1cmF0aW9uID0gNSkKYGBgCgpgYGB7ciwgQW5pbWF0aW9uXzIsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9CmFuaW1hdGlvbl8yIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW5lcmd5IFVzZSAoa2csIG9pbC1lcS4vY2FwaXRhKSIpICU+JQogIGZpbHRlcihZZWFyPj0xOTgwKSAlPiUKICBmaWx0ZXIoWWVhcjw9MjAxMCkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUsIGdyb3VwPUNvdW50cnksIGNvbG9yPVJlZ2lvbiwgc2l6ZT1SZWdpb24sIGFscGhhPVJlZ2lvbikpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWQiLCJCbGFjayIpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoMC4xLCAxKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMC4yNSwgMikpICsKICBsYWJzKHRpdGxlPSJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSwgMTk4MC0yMDEwIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgeWxhYigiRW5lcmd5IFVzZSBwZXIgQ2FwaXRhIikgKwogIHRyYW5zaXRpb25fdGltZShhcy5pbnRlZ2VyKFllYXIpKSArCiAgc2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAxLCBhbHBoYSA9IEZBTFNFKQoKYW5pbWF0ZShhbmltYXRpb25fMiwgZnBzID0gMTAsIGR1cmF0aW9uID0gNSkKYGBgCgpgYGB7ciwgQW5pbWF0aW9uXzMsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9CmFuaW1hdGlvbl8zIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iR0RQIEdyb3d0aC9DYXBpdGEgKCUpIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSwgY29sb3I9UmVnaW9uLCBzaXplPVJlZ2lvbiwgYWxwaGE9UmVnaW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlJlZCIsIkJsYWNrIikpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygwLjEsIDEpKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYygwLjI1LCAyKSkgKwogIGxhYnModGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBJbmRpY2F0b3JzIGJ5IFllYXIgYW5kIFZhbHVlLCAxOTgwLTIwMTAiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogIHlsYWIoIkdEUCBHcm93dGggcGVyIENhcGl0YSAoJSkiKSArCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl8zLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCmBgYHtyLCBBbmltYXRpb25fNCwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0KYW5pbWF0aW9uXzQgPC0gZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMiKSAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlLCBncm91cD1Db3VudHJ5LCBjb2xvcj1SZWdpb24sIHNpemU9UmVnaW9uLCBhbHBoYT1SZWdpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUmVkIiwiQmxhY2siKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKDAuMSwgMSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuMjUsIDIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUsIDE5ODAtMjAxMCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgeWxhYigiQ08yIEVtaXNzaW9ucyAoTWcpIikgKwogIHRyYW5zaXRpb25fdGltZShhcy5pbnRlZ2VyKFllYXIpKSArCiAgc2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAxLCBhbHBoYSA9IEZBTFNFKQoKYW5pbWF0ZShhbmltYXRpb25fNCwgZnBzID0gMTAsIGR1cmF0aW9uID0gNSkKYGBgCgpUbyBjb2xvciBvdXIgcGxvdCB3ZSB3aWxsIHVzZSB0aGUgdmlyaWRpcyBjb2xvciBwYWxsZXR0ZSB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggY29sb3ItYmxpbmRuZXNzIGJ5IHVzaW5nIHRoZSBgc2NhbGVfZmlsbF92aXJpZGlzX2MoKWAgZnVuY3Rpb24gd2hpY2ggaXMgc2ltcGx5IGF2YWlsYWJsZSBieSBsb2FkaW5nIHRoZSBgZ2dwbG90MmAgcGFja2FnZS5UaGVyZSBhcmUgYSBmZXcgdmFyaWF0aW9ucyBzdWNoIGFzIGRpc2NyZWV0IGFzIGBfZGAsIG9yIGJpbm5lZCBjb250aW51b3VzIGFzIGBfYmAuIFRoZSBgX2NgIGluZGljYXRlcyBhIGNvbnRpbnVvdXMgc2NhbGUuIFNlZSBbaGVyZV0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL3NjYWxlX3ZpcmlkaXMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpgYGB7cn0KVG9wMTA8LWRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5MDApICU+JQogIGZpbHRlcihZZWFyPD0yMDE0KSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobWF4X3ZhbCA9IG1heChWYWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocmFuaz1kZW5zZV9yYW5rKC1tYXhfdmFsKSkgJT4lCiAgZmlsdGVyKHJhbms8PTEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1mY3RfcmVvcmRlcihDb3VudHJ5LCBWYWx1ZSwgbWF4KSkpICsKICBnZW9tX3RpbGUoY29sb3I9InRyYW5zcGFyZW50IiwgYWVzKGZpbGw9bG9nKFZhbHVlKSkpICsKICAgIyBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKCJyZWQiLCJibGFjayIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoKSsKICMgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYygieWVsbG93IiwicmVkIiwiYmxhY2siKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgCiAgbGFicyh0aXRsZSA9ICJUb3AgMTAgRW1pc3Npb25zLXByb2R1Y2luZyBDb3VudHJpZXMgaW4gMjAxMCAoMTkwMC0yMDE0KSIsCiAgICAgICBzdWJ0aXRsZSA9ICJPcmRlcmVkIGJ5IEVtaXNzaW9ucyBQcm9kdWNlZCBpbiAyMDE0IiwKICAgICAgIGZpbGwgPSAiTG4oQ08yIEVtaXNzaW9ucyAoTWcpKSIpCgpUb3AxMApgYGAKSW50ZXJlc3RpbmdseSwgd2UgY2FuIHNlZSB0aGF0IEdlcm1hbnkgaGFkIHZlciBsb3cgaW1pc3Npb24gcmF0ZXMgYXQgdGhlIGVuZCBvZiBXb3JsZCBXYXIgSUkuIFdlIHNlZSB0aGF0IHRoZSBVUyBoYXMgY29uc2lzdGVudGx5IGhhZCBoaWdoIGVtaXNzaW9uIHJhdGVzIHNpbmNlIDE5MDAsIGJ1dCB0aGF0IHRoZSBlbWlzc2lvbiByYXRlcyBpbiBDaGluYSByZWNlbnRseSBzdXJwYXNlZCB0aGF0IG9mIHRoZSBVUy4KYGBge3J9CgpUb3AxMGI8LWRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5MDApICU+JQogIGZpbHRlcihZZWFyPD0yMDE0KSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobWF4X3ZhbCA9IG1heChWYWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocmFuaz1kZW5zZV9yYW5rKC1tYXhfdmFsKSkgJT4lCiAgZmlsdGVyKHJhbms8PTEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgY29sb3IgPSBDb3VudHJ5KSkgKwpnZW9tX2xpbmUoKSArICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoInJlZCIsImJsYWNrIikpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2QoKSsKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmX2xvbmcgJT4lCiAgZmlsdGVyKFR5cGU9PSJHbG9iYWwiKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5MDApICU+JQogIGZpbHRlcihZZWFyPD0yMDE0KSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobWF4X3ZhbCA9IG1heChWYWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocmFuaz1kZW5zZV9yYW5rKC1tYXhfdmFsKSkgJT4lCiAgZmlsdGVyKHJhbms8PTEwKSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoWWVhciA9PSBsYXN0KFllYXIpKSwKICAgICAgICAgICAgYWVzKGxhYmVsID0gQ291bnRyeSwKICAgICAgICAgICAgICAgIHggPSBZZWFyLAogICAgICAgICAgICAgICAgeSA9IFZhbHVlKSwKICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgIGFscGhhID0gMSwKICAgICAgICAgICAgbnVkZ2VfeCA9IDEwLAogICAgICAgICAgICBkaXJlY3Rpb24gPSAieSIsCiAgICAgICAgICAgIGhqdXN0ID0gMSwKICAgICAgICAgICAgdmp1c3QgPSAxLAogICAgICAgICAgICBzZWdtZW50LnNpemUgPSAwLjI1LAogICAgICAgICAgICBzZWdtZW50LmFscGhhID0gMC4yNSwKICAgICAgICAgICAgZm9yY2UgPSAxKSsKICB0aGVtZV9saW5lZHJhdygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgCiAgbGFicyh0aXRsZSA9ICJUb3AgMTAgRW1pc3Npb25zLXByb2R1Y2luZyBDb3VudHJpZXMgaW4gMjAxMCAoMTkwMC0yMDE0KSIsCiAgICAgICBzdWJ0aXRsZSA9ICJPcmRlcmVkIGJ5IEVtaXNzaW9ucyBQcm9kdWNlZCBpbiAyMDE0IiwKICAgICAgIGZpbGwgPSAiTG4oQ08yIEVtaXNzaW9ucyAoTWcpKSIpCgpUb3AxMGIKCgpgYGAKIyMgVVMtc3BlY2lmaWMKCmBgYHtyfQpkZl9sb25nX3VzIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnk9PSJVbml0ZWQgU3RhdGVzIikKCiMgQXBwcm94aW1hdGVkIGRlcml2YXRpdmUgZnVuY3Rpb24pCmRmX2xvbmdfdXMgPC0gZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhciA+PSAxOTAwLAogICAgICAgICBZZWFyIDw9IDIwMTApICU+JQogIGdyb3VwX2J5KEluZGljYXRvcikgJT4lCiAgbXV0YXRlKCJDaGFuZ2UgKCUpIj0oKFZhbHVlL2xhZyhWYWx1ZSkpKjEwMCktMTAwLAogICAgICAgICBNZWFuPW1lYW4oVmFsdWUpLAogICAgICAgICBBbm9tYWx5PVZhbHVlLU1lYW4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoQW5vbWFseV9jb2xvcj1pZmVsc2UoQW5vbWFseT4wLCJQb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShBbm9tYWx5PDAsIk5lZ2F0aXZlIiwiWmVybyIpKSwKICAgICAgICAgQW5vbWFseV9jb2xvcj1mYWN0b3IoQW5vbWFseV9jb2xvciwgbGV2ZWxzID0gYygiUG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpKQpgYGAKCmBgYHtyfQpVU19JbmRpY2F0b3JzIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnk9PSJVbml0ZWQgU3RhdGVzIiklPiUKI1VTX0luZGljYXRvcnM8LWRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIyBmaWx0ZXIoWWVhcjw9MjAxMCkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUpKSArIAogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIikgKwogIGZhY2V0X3dyYXAoSW5kaWNhdG9yfi4sIG5jb2w9MiwgbnJvdz0zLCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTAsYnk9NSksCiAgIyAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTk4MCwyMDEwLGJ5PTUpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnModGl0bGUgPSAiVVMtc3BlY2lmaWMgSW5kaWNhdG9ycyIpClVTX0luZGljYXRvcnMKYGBgCgpgYGB7cn0KZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTQpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBDaGFuZ2UgKCUpYCwgY29sb3I9SW5kaWNhdG9yLCBmaWxsPSJ0cmFuc3BhcmVudCIpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjgsIGxpbmV0eXBlPTIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MS4yLCBsaW5ldHlwZT0yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgbGluZXR5cGU9MykgKwogIGdlb21fbGluZShzaXplPTAuNSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5ODAsMjAxNCxieT01KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE5ODAsMjAxNCxieT01KSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTUwMCwxMjUwLCBieT0yNTApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoLTUwMCwxMjUwLCBieT0yNTApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgCiAgbGFicyh0aXRsZSA9ICJVUy1zcGVjaWZpYyBJbmRpY2F0b3JzICgxOTgwLTIwMTApIiwKICAgICAgIHN1YnRpdGxlID0gIkNoYW5nZSAoJSkgTGluZXMiKQoKZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTQpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkifAogICAgICAgICAgIEluZGljYXRvcj09IkVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSkifAogICAgICAgICAgIEluZGljYXRvcj09IkVtaXNzaW9ucyIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBDaGFuZ2UgKCUpYCwgY29sb3I9SW5kaWNhdG9yKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC44LCBsaW5ldHlwZT0yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEuMiwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlPTMpICsKICBnZW9tX2xpbmUoc2l6ZT0xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTQsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTgwLDIwMTQsYnk9NSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwxMCwgYnk9MSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgtMTAsMTAsIGJ5PTEpLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xMCwxMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyAKICBsYWJzKHRpdGxlID0gIkVtaXNzaW9ucywgRW5lcmd5IFVzZSwgYW5kIFRlbXBlcmF0dXJlICgxOTgwLTIwMTApIiwKICAgICAgIHN1YnRpdGxlID0gIkNoYW5nZSAoJSkgTGluZXMiKQoKZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkifAogICAgICAgICAgIEluZGljYXRvcj09IkVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSkifAogICAgICAgICAgIEluZGljYXRvcj09IkVtaXNzaW9ucyIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBDaGFuZ2UgKCUpYCwgY29sb3I9SW5kaWNhdG9yKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC44LCBsaW5ldHlwZT0yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEuMiwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlPTMpICsKICBnZW9tX3Ntb290aChzaXplPTEsIGFscGhhPTAuMSwgYWVzKGZpbGw9SW5kaWNhdG9yKSwgc2U9RkFMU0UpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5ODAsMjAxMCxieT01KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE5ODAsMjAxMCxieT01KSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLDEwLCBieT0xKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKC0xMCwxMCwgYnk9MSksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEwLDEwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyAKICBsYWJzKHRpdGxlID0gIlVTIEVtaXNzaW9ucywgRW5lcmd5IFVzZSwgYW5kIFRlbXBlcmF0dXJlcyAoMTk4MC0yMDEwKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJTbW9vdGhlZCBDaGFuZ2UgKCUpIExpbmVzIikKYGBgCgpgYGB7cn0KZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMifAogICAgICAgICAgIEluZGljYXRvcj09IlRlbXBlcmF0dXJlIChGYWhyZW5oZWl0KSIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlKSkgKwogIGdlb21fbGluZSgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTAsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTgwLDIwMTAsYnk9NSkpICsgCiAgZmFjZXRfd3JhcChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2w9MSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlPSJVUyBFbWlzc2lvbnMgYW5kIFRlbXBlcmF0dXJlcyAoMTk4MC0yMDEwKSIpCgpkZl9sb25nX3VzICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMifAogICAgICAgICAgIEluZGljYXRvcj09IlRlbXBlcmF0dXJlIChGYWhyZW5oZWl0KSIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5ODAsIGxpbmV0eXBlPTIsIGNvbG9yPSJibGFjayIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAxMCwgbGluZXR5cGU9MiwgY29sb3I9ImJsYWNrIikgKwogIGdlb21fc2VnbWVudChhZXMoeD1ZZWFyLCB5PVZhbHVlLCB4ZW5kPVllYXIsIHllbmQ9TWVhbixjb2xvcj1Bbm9tYWx5X2NvbG9yKSwgc2l6ZT0xLjI1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsImJsdWUiLCJncmF5IikpICsgCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1NZWFuKSwgbGluZXR5cGU9MSwgY29sb3I9ImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkwMCwyMDEwLGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTkwMCwyMDEwLGJ5PTUpKSArCiAgZmFjZXRfd3JhcChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2w9MSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgKwogIGxhYnModGl0bGUgPSAiVVMgRW1pc3Npb25zIGFuZCBUZW1wZXJhdHVyZXMgKDE5MDAtMjAxMCkiLAogICAgICAgc3VidGl0bGUgPSAiSW5kaWNhdG9yIE1lYW4gUmVwcmVzZW50ZWQgYnkgU29saWQgQmxhY2sgTGluZSIpCmBgYAoKYGBge3J9CmRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IlRlbXBlcmF0dXJlIChGYWhyZW5oZWl0KSJ8CiAgICAgICAgICAgSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9YENoYW5nZSAoJSlgKSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiwgYWxwaGE9MC4yNSwgZmlsbD0iZ3JlZW4iKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9MCwgYWxwaGE9MC4yNSwgZmlsbD0icmVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0xKSArIAogIGdlb21fc2VnbWVudChhZXMoeD1ZZWFyLCB5PWBDaGFuZ2UgKCUpYCwgeGVuZD1ZZWFyLCB5ZW5kPTApLCBzaXplPTEuMjUpICsKICBmYWNldF93cmFwKEluZGljYXRvcn4uLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbD0xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTAwLDIwMTAsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTAwLDIwMTAsYnk9NSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgCiAgbGFicyh0aXRsZSA9ICJVUyBFbWlzc2lvbnMsIEVuZXJneSBVc2UsIGFuZCBUZW1wZXJhdHVyZXMgKDE5ODAtMjAxMCkiLAogICAgICAgc3VidGl0bGUgPSAiQ2hhbmdlICglKSBMaW5lcyIpCmBgYAoKIyMgTWFpbiBwbG90CgpgYGB7cn0KCmxpYnJhcnkocGF0Y2h3b3JrKQoKQ08yX3dvcmxkICsgVG9wMTAgKyBVU19JbmRpY2F0b3JzICsKICBwbG90X2xheW91dCh3aWR0aHMgPSBjKDEsIDIpLCBoZWlnaHRzID0gdW5pdChjKDIsIDUpLCBjKCdjbScsICdudWxsJykpKQoKcG5nKGhlcmU6OmhlcmUoImltZyIsICJtYWlucGxvdC5wbmciKSwgd2lkdGggPSA5MDAsIGhlaWdodCA9IDcwMCkKKENPMl93b3JsZCB8IFRvcDEwKS8gVVNfSW5kaWNhdG9ycysKICAgIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMSwgMiksIGhlaWdodHMgPSB1bml0KGMoNCwgNSksIGMoJ2NtJywgJ251bGwnKSkpCmRldi5vZmYoKQpgYGAKCgo=